如何在 Go 中正确忽略 JSON 反序列化中的字段

3次阅读

如何在 Go 中正确忽略 JSON 反序列化中的字段

go 的 `encoding/json` 包中,可通过结构体字段标签 `json:”-“` 忽略字段的反序列化;但若标签中存在多余空格(如 `json: “-“`),标签将失效,导致字段仍被解析。

go 中,使用 json.Unmarshal 将 JSON 数据映射到结构体时,常需忽略某些不需要的字段(例如服务端返回的冗余元数据、临时字段或敏感字段)。标准做法是在对应结构体字段上添加 json:”-” 标签。但该标签对格式极其敏感:必须严格写作 json:”-“,不能包含任何空格或额外字符。

你示例中的问题根源在于字段标签写成了:

Baz bool `json: "-"`

注意 json: 和 – 之间有一个空格——这会导致 Go 完全忽略该标签,等效于无标签,因此 Baz 仍会按默认规则(字段名小写首字母匹配)尝试从 JSON 中查找 “baz” 并赋值为 true。

✅ 正确写法(无空格):

type Foo struct {     Bar bool `json:"bar"`     Baz bool `json:"-"` // ← 关键:冒号后紧接短横线,无空格 }

完整可运行示例:

package main  import (     "encoding/json"     "fmt" )  var data = []byte(`{"bar": true, "baz": true}`)  type Foo struct {     Bar bool `json:"bar"`     Baz bool `json:"-"` // 正确忽略 }  func main() {     var foo Foo     err := json.Unmarshal(data, &foo)     if err != nil {         panic(err)     }     fmt.Printf("%+vn", foo) // 输出:{Bar:true Baz:false} }

? 补充说明:

  • json:”-” 表示反序列化(Unmarshal)和序列化(Marshal)均忽略该字段
  • 若仅想忽略序列化(即导出 JSON 时不包含该字段),但保留反序列化能力,可使用 json:”-,”(注意逗号);
  • 字段若未设置 json 标签且为非导出字段(小写开头),则默认被忽略(因不可导出);
  • 建议始终使用 json 标签显式声明字段行为,避免依赖隐式规则,提升代码可维护性。

总结:json:”-” 是忽略字段的可靠方式,但务必确保标签语法精确——零空格、无引号外字符、冒号紧邻短横线。一个空格之差,就可能导致意料之外的数据污染。

text=ZqhQzanResources