内容简介:本文介绍在使用 Go 标准库中的
本文介绍在 Go
语言中,如何创建和解析 JSON
数据。
一、创建 JSON
使用 Go 标准库中的 encoding/json
,可以很方便从 struct、map、slice 等数据结构体来创建 JSON 数据。
1、从 struct 创建
通过 json.Marshal
,可以很方便的将一个 struct
转化为 []byte
类型的 JSON 数据。
package main import ( "encoding/json" "fmt" ) type Person struct { Name string Age int Emails []string } func main() { bingo := Person{ Name: "Bingo Huang", Age: 30, Emails: []string{"go@bingohuang.com", "me@bingohuang.com"}, } json_bytes, err := json.Marshal(bingo) if err != nil { panic(err) } fmt.Printf("%s",json_bytes) }
输出:
{"Name":"Bingo Huang","Age":30,"Emails":[go@bingohuang.com", "me@bingohuang.com"]}
注意: 1. 结构体中的字段名,需要大写开头,否则不会被输出
2. 结构体中可以嵌入其他结构体
3. json.Marshal
函数返回一个 []byte
类型的 JSON 数据和一个 error
,别忘了处理该 error
4. 返回的 []byte
类型 JSON 数据,如果你想当成字符串处理,需要做强制转换: string(json_bytes)
2、定义字段名称
如果你希望输出的 JSON 字段,不一定要大写字母开头,甚至想自定义 JSON 字段名,可以打上 json
tag
。
type Person struct { Name string `json:"name"` Age int `json:"age"` Emails []string `json:"emails"` }
再次输出:
{"name":"Bingo Huang","age":30,"emails":["go@bingohuang.com","me@bingohuang.com"]}
3、忽略空字段
如果你希望某些字段在数据为空时能能被自动忽略,只需加上 omitempty
标签。
package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name,omitempty"` Age int `json:"age,omitempty"` Emails []string `json:"emails,omitempty"` } func main() { bingo := Person{ Name: "Bingo Huang", } json_bytes, _ := json.Marshal(bingo) fmt.Printf("%s", json_bytes) }
输出:
{"name":"Bingo Huang"}
4、跳过某字段
如果你不想让某个字段(无论该字段数据是否为空)输出到 JSON 中,可使用 -
来跳过。
package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name,omitempty"` Age int `json:"-"` Emails []string `json:"emails,omitempty"` } func main() { bingo := Person{ Name: "Bingo Huang", Age: 27, } json_bytes, _ := json.Marshal(bingo) fmt.Printf("%s", json_bytes) }
输出:
{"name":"Bingo Huang"}
5、从 map 和 slice 创建
从 map
和 slice
来创建 JSON,也很容易,直接上示例
package main import ( "encoding/json" "fmt" ) func main() { bingo := map[string]interface{}{ "name": "Bingo Huang", "age": 30, } json_bytes, _ := json.Marshal(bingo) fmt.Printf("%s", json_bytes) }
输出:
{"age":30,"name":"Bingo Huang"}
package main import ( "encoding/json" "fmt" ) func main() { emails := []string{"go@bingohuang.com", "me@bingohuang.com"} json_bytes, _ := json.Marshal(emails) }
输出:
["go@bingohuang.com","me@bingohuang.com"]
二、解析 JSON
创建 JSON 是如此方便,那反过来看看 GO 如何解析 JSON。
1、解析到 struct
相反,可以通过 json.Unmarshal
来将一个 []byte
类型的 JSON 数据解析到 struct
中。
package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` Emails []string `json:"emails"` } func main() { json_bytes := []byte(` { "Name":"Bingo Huang", "Age":30, "Emails":["go@bingohuang.com","me@bingohuang.com"] } `) bingo := Person{} err := json.Unmarshal(json_bytes, &bingo) if err != nil { panic(err) } fmt.Println(bingo.Name, bingo.Age, bingo.Emails) }
这里我们将 json_bytes 和 Person 的指针传递给 json.Unmarshal
,注意要传递结构体的 指针
,因为解析器需要给结构体写入数据。
如果 JSON 数据中不包含结构体的某些字段,转换成 struct 时字段会被忽略,反过来如果结构体中某些字段不需要输出 JSON,也会被忽略,如下:
package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` Emails []string `json:"emails"` Address string } func main() { json_bytes := []byte(` { "Name":"Bingo Huang", "Age":30 } `) var bingo Person err := json.Unmarshal(json_bytes, &bingo) if err != nil { panic(err) } fmt.Println(bingo.Emails) fmt.Println(bingo.Address) }
这里 Emails
和 Address
字段都被忽略了,输出都为空。
2、解析到 map 和 slice
通过 json.Unmarshal
将 JSON 数据解析到 map
和 slice
也十分方便,这里以 map
为例。
package main import ( "encoding/json" "fmt" ) func main() { json_bytes := []byte(` { "Name":"Bingo Huang", "Age":30, "Emails":["go@bingohuang.com","me@bingohuang.com"] } `) var bingo map[string]interface{} err := json.Unmarshal(json_bytes, &bingo) if err != nil { panic(err) } fmt.Println(bingo["Name"], bingo["Age"], bingo["Emails"], bingo["Score"]) }
三、JSON 流处理
json
包还提供了另外两个函数 NewEncoder
和 NewDecoder
,提供 Encoder
和 Decoder
类型,可支持 io.Reader
和 io.Writer
接口做流处理。
1、创建 JSON 到文件中
我们可以将一个 JSON 文件转化到结构体中。
package main import ( "encoding/json" "fmt" "os" ) func main() { fileReader, _ := os.Open("bingo.json") var bingo map[string]interface{} json.NewDecoder(fileReader).Decode(&bingo) fmt.Println(bingo) }
bingo.json 内容如下:
{ "Name":"Bingo Huang", "Age":30, "Emails":["go@bingohuang.com","me@bingohuang.com"] }
输出:
map[Name:Bingo Huang Age:30 Emails:[go@bingohuang.com me@bingohuang.com]]
2、从文件中解析 JSON
同样,可以反过来,将对象转化为 JSON 格式,并写入文件中。
package main import ( "encoding/json" "os" ) type Person struct { Name string Age int Emails []string } func main() { bingo := Person{ Name: "Bingo Huang", Age: 30, Emails: []string{"go@bingohuang.com","me@bingohuang.com"}, } fileWriter, _ := os.Create("output.json") json.NewEncoder(fileWriter).Encode(bingo) }
输出的 out.json 文件为:
{"Name":"Bingo Huang","Age":30,"Emails":["go@bingohuang.com","me@bingohuang.com"]}
参考资料
以上所述就是小编给大家介绍的《Go 处理 JSON 教程 - 如何创建和解析 JSON 数据》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Spring容器创建源码解析
- Spring源码解析:Bean实例的创建和初始化
- spring5 源码深度解析— IOC 之 bean 创建
- Apache Johnzon 1.1.8 发布,用于解析和创建 JSONP
- Apache Johnzon 1.1.8 发布,用于解析和创建 JSONP
- Apache Johnzon 1.0.1,解析和创建 JSON 的 Java 库
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Writing Windows VxDs and Device Drivers, Second Edition
Karen Hazzah / CMP / 1996-01-12 / USD 54.95
Software developer and author Karen Hazzah expands her original treatise on device drivers in the second edition of "Writing Windows VxDs and Device Drivers." The book and companion disk include the a......一起来看看 《Writing Windows VxDs and Device Drivers, Second Edition》 这本书的介绍吧!
Markdown 在线编辑器
Markdown 在线编辑器
UNIX 时间戳转换
UNIX 时间戳转换