Golang的encoding/json库如何工作 结构体标签与序列化技巧

Go语言的encoding/json库通过反射实现Go值与JSON互转,支持基本类型、结构体、切片、映射等,其中结构体最常用。通过结构体标签(如json:”name”)可自定义JSON字段名,首字母大写的字段才能被导出。常用标签选项包括:omitempty表示零值时省略字段,-表示完全忽略字段,string表示以字符串形式编码。嵌套结构体可递归处理,匿名字段的字段会被提升至外层。反序列化时优先匹配json标签名,无标签则匹配字段原名,未定义的JSON字段默认被忽略,可通过map或自定义UnmarshalJSON捕获。实现json.Marshaler和Unmarshaler接口可自定义序列化逻辑,如格式化时间输出。掌握标签和接口定制即可灵活处理JSON。

golang的encoding/json库如何工作 结构体标签与序列化技巧

Go语言的

encoding/json

库通过反射机制将Go值与JSON数据之间相互转换。它能处理基本类型、结构体、切片、映射等,其中结构体是最常用的序列化目标。理解结构体标签(struct tags)和一些序列化技巧,能帮助你更灵活地控制JSON的输出和解析行为。

结构体标签控制JSON字段名

结构体字段可以通过

json

标签自定义JSON中的键名。默认情况下,字段名会直接转为JSON键,但首字母大写字段才能被导出(序列化)。

示例:

type User struct {    Name string `json:"name"`    Age  int    `json:"age"`}

序列化时,

Name

字段会变成

"name"

,而不是

"name"

。如果不写标签,会使用字段原名;如果字段名是小写(如

Name

),则不会被序列化。

常用标签选项

除了指定字段名,

json

标签还支持多个选项,用逗号分隔:

立即学习“go语言免费学习笔记(深入)”;

omitempty:如果字段值为零值(如空字符串、0、nil等),则在JSON中省略该字段 :完全忽略该字段,不参与序列化和反序列化 string:强制将某些类型(如数字或布尔)以字符串形式编码示例:

type Product struct {    ID       int     `json:"id"`    Title    string  `json:"title"`    Price    float64 `json:"price,omitempty"`    Secret   string  `json:"-"`    Count    int     `json:"count,string,omitempty"`}

Price

为0时,不会出现在JSON中。

Secret

字段则完全被忽略。

Count

会被编码为字符串,即使它是整数。

嵌套结构与匿名字段的处理

结构体可以嵌套,

encoding/json

会递归处理。匿名字段(内嵌结构体)的字段会被“提升”到外层结构体中。

示例:

type Address struct {    City  string `json:"city"`    State string `json:"state"`}type Person struct {    Name    string  `json:"name"`    Address         // 匿名字段    ZipCode string  `json:"zip"`}

序列化

Person

时,

City

State

会直接出现在JSON顶层,如同它们是

Person

的字段。

反序列化时的字段匹配规则

反序列化时,库会根据JSON键名匹配结构体字段。匹配过程不区分标签顺序,但必须满足:

字段必须是导出的(首字母大写) 使用

json

标签优先匹配标签名 若无标签,则匹配字段原名

如果JSON包含结构体中不存在的字段,默认会忽略。若想捕获未知字段,可使用

map[string]interface{}

或自定义

UnmarshalJSON

方法。

自定义序列化行为

某些类型(如时间、自定义枚举)可能需要特殊处理。实现

json.Marshaler

json.Unmarshaler

接口可控制序列化逻辑。

示例:格式化时间

type CustomTime struct {    time.Time}func (ct *CustomTime) MarshalJSON() ([]byte, error) {    return json.Marshal(ct.Time.Format("2006-01-02"))}func (ct *CustomTime) UnmarshalJSON(data []byte) error {    var s string    if err := json.Unmarshal(data, &s); err != nil {        return err    }    t, err := time.Parse("2006-01-02", s)    if err != nil {        return err    }    ct.Time = t    return nil}

这样,时间字段可以按指定格式输出为字符串。

基本上就这些。掌握结构体标签和接口定制,就能灵活应对大多数JSON处理场景。

以上就是Golang的encoding/json库如何工作 结构体标签与序列化技巧的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1397779.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月15日 15:01:03
下一篇 2025年12月15日 15:01:11

相关推荐

发表回复

登录后才能评论
关注微信