目录
何为JSON
编码JSON
实践时刻
解码JSON
实践时刻
延伸拓展
何为JSON
JSON (JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。JSON最初是
JavaScript的一部分,后由于便于快速编写的特性,被开发者独立出来。基本上所有的语言都支持JSON数据的编码和解码。对于网络编程而言,JSON的重要性不言而喻。
JSON中的键以字符串存储,值可以取任意类型。
它有以下三种结构:
- 字符串或数组类型:{"name":"Mark","age":18}
- JSON数组:[{"name":" Tom","age":18},{"name":"Jerry","age":17}]
- 嵌套类型:{"name":" Tom", "birthday":{"month":12,"day":25}}
大括号“{}”用来描述一组“不同类型的无序键值对集合”,方括号“[]”用来描述一组“相同类型的有序数据集合”。
编码JSON
GO的标准库提供了 encoding/json 来处理JSON。涉及到的接口有以下几种:
func Marshal(v interface{}) ([]byte, error)
Marshal函数要求提供一个接口类型的参数,通常interface{}类型会用结构体和map等数据结构来传入。
还有一种JSON编码接口,提供格式化输出的操作:
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)
MarshalIndent是Marshal的升级版,可以按照所设计的特定格式进行格式化输出。其中prefix参数用于对每字段进行标记分隔。
实践时刻
代码示例:
/*
------------------------------------------------------------------------------- @FILE handle_json_map.go- @AUTHOR MAX TSANG- @EMAIL ZIHANTSANG@HOTMAIL.COM- @DATE 2023/07/23 16:46:43- @BRIEF MAP2JSON------------------------------------------------------------------------------
*/package mainimport ("encoding/json""fmt"
)func main() {data_map := make(map[string]interface{}, 5)data_map["name"] = "Mark"data_map["sex"] = "male"data_map["age"] = 24data_map["birth"] = "1998-01-01"data_map["Education"] = []string{"Bachelor,Master"}res, _ := json.Marshal(data_map) //_对error信息省略res_format, _ := json.MarshalIndent(data_map, "", " ")fmt.Println("result = ", string(res))fmt.Println("result with format = ", string(res_format))
}
输出结果:
除此之外,我们还可以用结构体struct来与JSON进行互转
* 一般情况下,推荐都使用结构体struct来进行编解码操作
代码示例:
/*
------------------------------------------------------------------------------- @FILE handle_json_struct.go- @AUTHOR MAX TSANG- @EMAIL ZIHANTSANG@HOTMAIL.COM- @DATE 2023/07/23 16:51:22- @BRIEF STRUCT2JSON------------------------------------------------------------------------------
*/package mainimport ("encoding/json""fmt"
)type Resume struct {Name string `json:"name "`Sex string `json:"sex "`Age int `json:"age "`Education []string `json:"education "`Inservice bool `json:"inservice "`
}func main() {resume := Resume{"Mark", "female", 24,[]string{"bachelor,master"}, false}res, err := json.MarshalIndent(resume, "", " ")if err != nil {fmt.Println(err)}fmt.Println("result = ", string(res))
}
输出结果:
在编辑struct字段时,可以在字段后添加标签来控制编解码的过程。控制字段有以下三种:
- - : 不解析该字段
- omitempty : 当字段为空或长度为0(map array string等结构)时不解析
- FieldName: 解析JSON时,使用该名称 (在代码示例中的name sex age ... 这些都属于FieldName)
解码JSON
在对JSON解码时,标准库提供了Unmarshal接口。
func Unmarshal(data []byte, v interface{}) error
Unmarshal函数解析JSON时,需要传入一个接口类型的参数,而写入接口有以下类型:
Bool | 对应JSON布尔类型 |
float64 | 对应JSON数字类型 |
string | 对应JSON字符串类型 |
[]interface{} | 对应JSON数组 |
map[string]interface{} | 对应JSON对象 |
nil | 对应JSON的null |
当JSON值与给出的目标类型不匹配或JSON输出的值超出写入目标类型的范围内,Unmarshal会自动跳过该字段并完成其余的解码操作 。
实践时刻
延伸拓展
Go所提供的标准 "encoding/json" 可以满足我们基本的对于JSON的编码、解码操作,但性能上并不是最佳,有一个更好的开源项目- Fastjson 可以帮助我们解决这个问题。如果感兴趣可以到GitHub上查找该项目
努力撰文ing……