商城首页欢迎来到中国正版软件门户

您的位置:首页 >JSON反序列化忽略字段的用法解析

JSON反序列化忽略字段的用法解析

  发布于2026-04-08 阅读(0)

扫一扫,手机访问

使用 json:"-" 完全忽略字段的序列化和反序列化,json:",omitempty" 仅在序列化时按零值省略;二者不可共存,后者会被前者覆盖;可通过嵌套结构体或自定义 UnmarshalJSON 实现更灵活控制。

json ignore反序列化 _ JSON反序列化时忽略字段的json:\

当使用 Go 语言对 JSON 数据进行反序列化时,若结构体字段需在反序列化过程中被完全跳过(无论 JSON 中是否存在该字段),或需根据字段值是否为空决定是否忽略序列化,需合理运用 json:"-"json:",omitempty" 标签。以下是实现该目标的具体方法:

一、使用 json:"-" 完全忽略字段

该标签使字段在 JSON 反序列化和序列化两个方向均被彻底忽略,结构体字段不会从 JSON 输入中读取值,也不会输出到 JSON 输出中。

1、定义结构体时,在目标字段的 struct tag 中设置 json:"-"

2、对该结构体调用 json.Unmarshal 时,即使 JSON 字符串中包含对应键名,其值也不会被赋给该字段。

3、对该结构体调用 json.Marshal 时,该字段不会出现在输出 JSON 中,且不参与任何空值判断逻辑。

二、使用 json:",omitempty" 按零值条件忽略字段

该标签仅在序列化(Marshal)阶段生效,表示当字段值为其类型的零值(如 0、""、nil、false 等)时,该字段将被省略;但在反序列化(Unmarshal)阶段仍会接收并赋值,不影响字段读取。

1、在结构体字段 tag 中添加 json:",omitempty",注意逗号不可省略。

2、反序列化时,JSON 中存在该字段则正常赋值,不存在则保留结构体中原始值(通常为零值)。

3、序列化时,若字段值为零值,则整个键值对不输出;非零值则正常输出。

三、组合使用 "-" 和 "omitempty" 的实际效果

二者不可同时作用于同一字段:若同时指定 json:"-"json:",omitempty",Go 编译器将忽略 omitempty,仅保留 "-" 的语义,即字段完全被忽略。

1、编写结构体字段 tag 为 json:"field_name,-"json:"field_name,omitempty,-" 均等效于 json:"-"

2、运行 json.Unmarshal 时,该字段始终不参与解析,JSON 中的同名字段被静默丢弃。

3、运行 json.Marshal 时,该字段永不出现于输出结果中,不受其当前值影响。

四、通过嵌套结构体实现选择性忽略

当需对同一字段在不同场景下分别控制序列化与反序列化行为时,可借助嵌入结构体配合不同 tag 实现隔离。

1、定义一个内部匿名结构体,其中字段使用 json:"-" 标签,用于屏蔽反序列化。

2、在外部结构体中另设同名字段,使用 json:",omitempty" 标签,仅控制序列化输出。

3、确保两字段类型一致,并在业务逻辑中显式同步赋值,以维持数据一致性。

五、使用自定义 UnmarshalJSON 方法绕过默认标签逻辑

当标准 tag 无法满足复杂忽略策略(例如仅在特定条件下忽略某字段),可为结构体实现 UnmarshalJSON 接口,手动控制字段解析流程。

1、在结构体定义中省略相关字段的 JSON tag,或使用占位名(如 json:"_ignore_me")。

2、为该结构体实现 func (s *MyStruct) UnmarshalJSON(data []byte) error 方法。

3、在方法内调用 json.Unmarshal 到临时 map 或结构体,检查并过滤掉需忽略的键,再将剩余数据赋值给目标字段。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注