Go 言语中的言语 encoding/json 库供给了宏壮的将 Go 中各类圭表类型与JSON格式之间转换的下场, 我们次要独霸以下几个下场 :
- 将一个切片 、标准筹划体或字典序列化成 JSON 格式标字符串【字撙节】。独霸
- 将一个 JSON 格式标字符串【字撙节】反序列化成一个切片、言语筹划体或字典。标准
序列化
序列化独霸 json 库中的独霸Marshal函数:
func Marshal(v inte***ce{ }) ([]byte, error)1. 筹划体序列化
比如独霸以下的筹划体展示一部片子 :
type Movie struct { Title string Year int `json:"released"` Color bool `json:"color,omitempty"` Actors []string }定义里圭表类型后背跟的字符串 json:"released"和json:"color,omitempty ,称为 field tags ,言语它陈述 json 库在奉行序列化时的标准一些轨则:
- json:"released" 使得在序列化后对应的名字为"released" ,而不是独霸"Year"。
- json:"color,言语omitempty"使得假定 Color 成员的值为false,那么就忽视它,标准舛错它举办序列化。独霸
没有 field tags 时举办序列化的言语一些轨则 :
- 假定筹划体成员的名字不是以除夜写字母开首,则舛错它举办序列化。标准
- 假定筹划体成员的独霸名字是以除夜写字母开首,则序列化后的名字就是成员名 。
举办序列化的代码以下:
movie := Movie{ Title: "Casablanca", Year: 1942, Color: false, Actors: []string{ "Humphrey Bogart", "Ingrid Bergman"}, } data, err := json.Marshal(movie) if err != nil { log.Fatalf("JSON marshaling failed: %s", err) } fmt.Printf("%s\n", data)输进:
{ "Title":"Casablanca","released":1942,"Actors":["Humphrey Bogart","Ingrid Bergman"]}
2. 字典序列化
一个字典要想序列化成- JSON 格式,它的 key 必须是字符串 。
以下是一个例子 :
info := map[string]int{ "width": 1280, "height": 720, } data, err := json.MarshalIndent(info, "", " ") if err != nil { log.Fatalf("JSON marshaling failed: %s", err) } fmt.Printf("%s\n", data)输进:
{
"height": 720,
"width": 1280
}
这里我们独霸MarshalIndent函数,使得输进后的 JSON 格式更随便不雅不雅不雅不雅鉴赏 。序列化后的名字就是字典中 key 的称号 。
3. 切片序列化
直接看一个例子 :
type Movie struct { Title string Year int `json:"released"` Color bool `json:"color,omitempty"` Actors []string } var movies = []Movie{ { Title: "Casablanca", Year: 1942, Color: false, Actors: []string{ "Humphrey Bogart", "Ingrid Bergman"}, }, { Title: "Cool Hand Luke", Year: 1967, Color: true, Actors: []string{ "Paul Newman"}, }, { Title: "Bullitt", Year: 1968, Color: true, Actors: []string{ "Steve McQueen", "Jacqueline Bisset"}, }, } data, err := json.MarshalIndent(movies, "", " ") if err != nil { log.Fatalf("JSON marshaling failed: %s", err) } fmt.Printf("%s\n", data)输进:
[
{
"Title": "Casablanca",
"released": 1942,
"Actors": [
"Humphrey Bogart",
"Ingrid Bergman"
]
},
{
"Title": "Cool Hand Luke",
"released": 1967,
"color": true,
"Actors": [
"Paul Newman"
]
},
{
"Title": "Bullitt",
"released": 1968,
"color": true,
"Actors": [
"Steve McQueen",
"Jacqueline Bisset"
]
}
]
反序列化
反序列化独霸Unmarshal函数:
func Unmarshal(data []byte, v inte***ce{ }) error1. 了了晓得 JSON 格式
我们要先将 JSON 格式展示为一个断定的圭表类型 。
1.以下的 JSON 格式:
{ "name": "Awesome 4K", "resolutions": [ { "width": 1280, "height": 720 }, { "width": 1920, "height": 1080 }, { "width": 3840, "height": 2160 } ] }我们可以用以下筹划体来展示它:
struct { Name string Resolutions []struct { Width int Height int }}2.以下的 JSON 格式:
{ "height": 720, "width": 1280}也可独霸map[string]int,也就是字典来展示。
3.以下的 JSON 格式 :
[ { "width": 1280, "height": 720 }, { "width": 1920, "height": 1080 }, { "width": 3840, "height": 2160 }]独霸切片[]map[string]int来展示。
非论若何 ,一个断定的JSON格式老是可独霸切片 、筹划体或字典来展示 。
此后便可以奉行反序列化了:
var jsonBlob = []byte(` [ { "width": 1280, "height": 720 }, { "width": 1920, "height": 1080, }, { "width": 3840, "height": 2160 } ] `) di := []map[string]int{ } err = json.Unmarshal(jsonBlob, &di) if err != nil { fmt.Println("error:", err) } fmt.Printf("%+v\n", di)输进
[map[height:720 width:1280] map[height:1080 width:1920] map[height:2160 width:3840]]
2. 没法断定 JSON 格式
没法断定的格式可以直接独霸inte***ce{ }圭表类型来展示。这个时辰 ,假定是JSON对象 ,则反序列化时 json 库会独霸map[string]inte***ce{ }圭表类型来展示它。假定是JSON数组,则会独霸[]inte***ce{ }圭表类型来展示它。具体inte***ce{ }对应的具体圭表类型 ,就需求独霸圭表类型断言了。
具体看一个示例 :
package mainimport ( "encoding/json" "fmt")func main() { var jsonBlob = []byte(` { "name": "Awesome 4K", "price": 1999.9, "resolutions": [ { "width": 1280, "height": 720 }, { "width": 1920, "height": 1080 }, { "width": 3840, "height": 2160 } ] } `) var d inte***ce{ } err := json.Unmarshal(jsonBlob, &d) if err != nil { fmt.Println("error:", err) } fmt.Println(d) m := d.(map[string]inte***ce{ }) for k, v := range m { switch vv := v.(type) { case string: fmt.Println(k, "is string", vv) case float64: fmt.Println(k, "is float64", vv) case []inte***ce{ }: fmt.Println(k, "is an array:") for i, u := range vv { fmt.Println(i, u) } default: fmt.Println(k, "is of a type I don't know how to handle") } }}输进 :
map[name:Awesome 4K price:1999.9 resolutions:[map[height:720 width:1280] map[height:1080 width:1920] map[height:2160 width:3840]]]
resolutions is an array:
0 map[height:720 width:1280]
1 map[height:1080 width:1920]
2 map[height:2160 width:3840]
name is string Awesome 4K
price is float64 1999.9
到此这篇关于Go 言语 JSON 标准库的独霸的文章就引见到这了,更多相干Go言语 言语 JSON 标准库内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载!



