zoukankan      html  css  js  c++  java
  • 操作 JSON 数据

    JSON格式

    • JavaScript对象表示法(JSON)是一种用于发送和接收结构化信息的标准协议。
    • JSON是对JavaScript中各种类型的值——字符串、数字、布尔值和对象——Unicode文本编码。
    • Go语言对于这些标准格式的编码和解码都有良好的支持,由标准库中的encoding/json、encoding/xml、encoding/asn1等包提供支持。

    编码

    • 待编码的结构体可以在声明中添加元信息来辅助json操作。
    • 结构体字段的元信息在字段声明的尾部使用字面值表示即被反单引号包围。
    • 元信息格式为json:"内容",其中内容可以指定解析后的字段名,添加omitempty可以使编码时跳过零值字段。
    • 需要编码的字符首字母必须大写,即为可导出的字段。

    解码

    • 解码需要有json内容对应的结构体来接收。
    • 未出现在结构体中的数据将不解析。
    • 结构体字段首字母小写的也不会被解析。

    实例

    • 除了json.MarShaljson.UnMarShal也提供了json.Encodejson.Decode数据流方式的操作。
    package main
    
    import (
    	"encoding/json"
    	"fmt"
    	"net/http"
    )
    
    type Info struct {
    	Name   string
    	Sex    byte `json:"性别,omitempty"`
    	Age    int
    	adress string // 小写名称不会被解析
    }
    
    func main() {
    
    	infos := []Info{
    		{Name: "张三", Sex: 0, Age: 21, adress: "湖北"},
    		{Name: "李四", Sex: 1, Age: 20, adress: "湖北"},
    		{Name: "王五", Sex: 1, Age: 19, adress: "湖北"},
    		{Name: "赵六", Sex: 0, Age: 18, adress: "湖北"},
    	}
    
    	// 编码
    	jsonStr, err := json.MarshalIndent(infos, "", "  ") // json.Marshal 无空格输出
    	if err != nil {
    		fmt.Println(err.Error())
    	}
    	fmt.Println("编码结果:
    ", string(jsonStr))
    
    	// 解码
    	var data []struct{ Name string }
    	err = json.Unmarshal(jsonStr, &data)
    	if err != nil {
    		fmt.Println(err.Error())
    	}
    	fmt.Printf("解码结果: 
     %#v 
    ", data)
    
    	TestNewDecode()
    }
    
    func TestNewDecode() {
    
    	// json.NewDecode 针对数据流操作
    	var commitInfo struct{ Node_id, Url, Html_url string }
    	resp, err := http.Get("https://api.github.com/repos/golang/go/git/commits/db66972359073ce2f83c9863d77444eca5a73006")
    	if err != nil {
    		fmt.Println(err.Error())
    	}
    	defer resp.Body.Close()
    	err = json.NewDecoder(resp.Body).Decode(&commitInfo)
    	if err != nil {
    		fmt.Println(err.Error())
    	}
    	fmt.Printf("Decode结果:
     %#v 
    ", commitInfo)
    }
    
  • 相关阅读:
    学习《Spring 3.x 企业应用开发实战》Day-1
    java面试32问
    线程的同步和异步
    TCP和UDP的区别
    深入理解Spring系列之四:BeanDefinition装载前奏曲
    深入浅出JDK动态代理(一)
    和大牛之间的差距
    深入理解Spring系列之三:BeanFactory解析
    深入理解Spring系列之二:BeanDefinition解析
    深入理解Spring系列之一:开篇
  • 原文地址:https://www.cnblogs.com/devzyh/p/12670256.html
Copyright © 2011-2022 走看看