JSON格式
- JavaScript对象表示法(JSON)是一种用于发送和接收结构化信息的标准协议。
- JSON是对JavaScript中各种类型的值——字符串、数字、布尔值和对象——Unicode文本编码。
- Go语言对于这些标准格式的编码和解码都有良好的支持,由标准库中的encoding/json、encoding/xml、encoding/asn1等包提供支持。
编码
- 待编码的结构体可以在声明中添加元信息来辅助json操作。
- 结构体字段的元信息在字段声明的尾部使用字面值表示即被反单引号包围。
- 元信息格式为
json:"内容"
,其中内容可以指定解析后的字段名,添加omitempty
可以使编码时跳过零值字段。
- 需要编码的字符首字母必须大写,即为可导出的字段。
解码
- 解码需要有json内容对应的结构体来接收。
- 未出现在结构体中的数据将不解析。
- 结构体字段首字母小写的也不会被解析。
实例
- 除了
json.MarShal
和json.UnMarShal
也提供了json.Encode
和json.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)
}