Go语言通过encoding/json实现JSON编解码,json.Marshal和Unmarshal用于结构体与JSON互转,字段需大写并可用tag自定义,支持omitempty忽略空值;反序列化时自动忽略多余字段;动态JSON可用map[string]interface{}解析,数值默认为float64;MarshalIndent可格式化输出;NewDecoder/NewEncoder支持流式处理,适用于大文件或网络数据。

Go语言通过标准库encoding/json提供了对JSON数据的编码和解码支持,使用起来简单高效。无论是处理API接口、配置文件还是前后端数据交换,json.Marshal和json.Unmarshal是最常用的方法。
1. 结构体与JSON的序列化(Marshal)
将Go结构体转换为JSON字符串的过程称为序列化。结构体字段需以大写字母开头才能被encoding/json导出。
可以通过结构体标签(struct tag)自定义JSON字段名、忽略空值等行为。
type User struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"` // 当Email为空时不输出}user := User{Name: "Alice", Age: 25}jsonData, err := json.Marshal(user)if err != nil { log.Fatal(err)}fmt.Println(string(jsonData)) // 输出:{"name":"Alice","age":25}
2. JSON反序列化到结构体(Unmarshal)
将JSON数据解析到Go结构体中,需要确保字段类型匹配,且结构体字段可导出。
立即学习“go语言免费学习笔记(深入)”;
jsonStr := `{"name":"Bob","age":30,"email":"bob@example.com"}`var user Usererr := json.Unmarshal([]byte(jsonStr), &user)if err != nil { log.Fatal(err)}fmt.Printf("%+vn", user) // 输出:{Name:Bob Age:30 Email:bob@example.com}
如果JSON字段多于结构体字段,多余字段会被忽略;若结构体字段缺失,对应值保持零值。
3. 处理动态或未知结构的JSON
当无法预定义结构体时,可以使用map[string]interface{}或interface{}解析任意JSON。
var data map[string]interface{}json.Unmarshal([]byte(jsonStr), &data)for k, v := range data { fmt.Printf("%s: %v (%T)n", k, v, v)}// 输出字段及其实际类型,如:// name: Bob (string)// age: 30 (float64)
注意:JSON数值在interface{}中默认解析为float64,需类型断言后使用。
4. 格式化输出与流式处理
使用json.MarshalIndent可生成格式化JSON,便于调试:
prettyJSON, _ := json.MarshalIndent(user, "", " ")fmt.Println(string(prettyJSON))
对于大文件或网络流,可用json.NewDecoder和json.NewEncoder逐个读写对象:
decoder := json.NewDecoder(os.Stdin)var v Userif err := decoder.Decode(&v); err != nil { log.Fatal(err)}
基本上就这些。掌握Marshal、Unmarshal、结构体标签和接口类型处理,就能灵活应对大多数JSON场景。不复杂但容易忽略细节,比如字段导出规则和类型匹配问题。
以上就是Golang如何使用encoding/json处理JSON数据的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1417851.html
微信扫一扫
支付宝扫一扫