内容简介:本文介绍在使用 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 库
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序员的思维修炼
Andy Hunt / 崔康 / 人民邮电出版社 / 2010-12-10 / 39.00元
本书解释了为什么软件开发是一种精神活动,思考如何解决问题,并就开发人员如何能更好地开发软件进行了评论。书中不仅给出了一些理论上的答案,同时提供了大量实践技术和窍门。 本书供各层次软件开发人员阅读。一起来看看 《程序员的思维修炼》 这本书的介绍吧!