Go中通过encoding/json包与结构体标签实现JSON编解码,利用json:”name”指定字段名,omitempty省略空值,”-“忽略字段,结合map[string]interface{}处理动态字段,嵌套结构体和切片应对复杂结构,实现Marshaler/Unmarshaler接口自定义时间等类型序列化,需注意导出字段首字母大写及空值判断规则。

在 Go 语言开发中,encoding/json 包与结构体的结合使用是处理 JSON 数据的核心方式。无论是解析 HTTP 请求中的 JSON 数据,还是将程序数据序列化为 JSON 响应,都离不开结构体与 json 标签的合理设计。
结构体字段与 JSON 映射
Go 中通过结构体字段的标签(tag)控制 JSON 的序列化和反序列化行为。最常见的用法是 json: 标签,用于指定字段在 JSON 中的名称。
例如:
type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email,omitempty"` Age int `json:"-"`}
说明:
立即学习“go语言免费学习笔记(深入)”;
json:”id”:序列化和反序列化时,该字段对应 JSON 中的 “id” 字段。 omitempty:如果字段值为空(如零值、nil、空字符串等),序列化时会省略该字段。 json:”-“:明确忽略该字段,不参与序列化或反序列化。
处理动态或未知字段
有时我们无法提前定义所有字段,比如接收第三方 API 的部分未知结构。此时可结合 map[string]interface{} 或嵌套结构体灵活处理。
示例:
type Response struct { Status string `json:"status"` Data map[string]interface{} `json:"data"`}
使用 json.Unmarshal 可将任意 JSON 对象解析到 map 中,之后按需访问字段。注意类型断言的使用:
if name, ok := data["name"].(string); ok { fmt.Println("Name:", name)}
嵌套结构与切片处理
实际应用中,JSON 往往包含数组或嵌套对象。Go 结构体可通过嵌套结构体或切片自然表达。
例如:
type Address struct { City string `json:"city"` Zip string `json:"zip"`}type User struct { Name string `json:"name"` Emails []string `json:"emails"` Address Address `json:"address"`}
上述结构能正确解析如下 JSON:
{ "name": "Alice", "emails": ["a@example.com", "b@example.net"], "address": { "city": "Beijing", "zip": "100000" }}
自定义序列化行为
对于特殊类型(如时间格式、枚举值),可实现 json.Marshaler 和 Unmarshaler 接口来自定义编解码逻辑。
常见例子是格式化时间:
type CustomTime struct { time.Time}func (ct *CustomTime) MarshalJSON() ([]byte, error) { return []byte(fmt.Sprintf(`"%s"`, ct.Time.Format("2006-01-02"))), nil}func (ct *CustomTime) UnmarshalJSON(data []byte) error { loc, _ := time.LoadLocation("Asia/Shanghai") t, err := time.ParseInLocation(`"2006-01-02"`, string(data), loc) if err != nil { return err } ct.Time = t return nil}
然后在结构体中使用:
type Event struct { Title string `json:"title"` Date CustomTime `json:"date"`}
基本上就这些。合理利用结构体标签、嵌套结构和接口实现,能让 Go 程序轻松应对各种 JSON 场景。关键是结构清晰、标签准确,避免过度依赖泛型 map。不复杂但容易忽略细节,比如大小写导出和 omitempty 的触发条件。
以上就是Golang encodingJSON与结构体结合使用实践的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1412837.html
微信扫一扫
支付宝扫一扫