
在 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("%+v\n", foo) // 输出:{Bar:true Baz:false}
}? 补充说明:
- json:"-" 表示反序列化(Unmarshal)和序列化(Marshal)均忽略该字段;
- 若仅想忽略序列化(即导出 JSON 时不包含该字段),但保留反序列化能力,可使用 json:"-,"(注意逗号);
- 字段若未设置 json 标签且为非导出字段(小写开头),则默认被忽略(因不可导出);
- 建议始终使用 json 标签显式声明字段行为,避免依赖隐式规则,提升代码可维护性。
总结:json:"-" 是忽略字段的可靠方式,但务必确保标签语法精确——零空格、无引号外字符、冒号紧邻短横线。一个空格之差,就可能导致意料之外的数据污染。










