
在 go 的 `encoding/json` 包中,可通过结构体字段标签 `json:"-"` 忽略特定字段的反序列化;但若标签中存在多余空格(如 `json: "-"`),标签将失效,导致字段仍被解析。
在 Go 中,使用 json.Unmarshal 将 JSON 数据映射到结构体时,可通过结构体字段的 json 标签控制字段行为。其中,json:"-" 是一个特殊标记,表示该字段在反序列化(Unmarshal)和序列化(Marshal)过程中均被完全忽略——即不会从 JSON 中读取值,也不会写入 JSON。
然而,该标签对格式极其敏感:必须严格写作 json:"-",不能包含任何空格或额外字符。例如:
❌ 错误写法(标签失效):
Baz bool `json: "-"` // 冒号后有空格 → 被视为无效标签,等同于无标签
此时 Baz 字段会按默认规则参与反序列化(字段名匹配 "baz"),因此 {"bar": true, "baz": true} 仍将 Baz 设为 true。
✅ 正确写法(生效):
Baz bool `json:"-"` // 无空格,标准语法
此时 Baz 完全跳过解析,保留其零值(bool 类型为 false),输出为 {true false}。
完整可运行示例:
package main
import (
"encoding/json"
"fmt"
)
var data = []byte(`{"bar": true, "baz": true}`)
type Foo struct {
Bar bool `json:"bar"` // 显式映射 "bar"
Baz bool `json:"-"` // ✅ 正确忽略
}
func main() {
var foo Foo
if err := json.Unmarshal(data, &foo); err != nil {
panic(err)
}
fmt.Printf("%+v\n", foo) // 输出:{Bar:true Baz:false}
}⚠️ 注意事项:
- json:"-" 同时禁用 Unmarshal 和 Marshal,若仅需忽略序列化(即导出时不包含该字段),应使用 json:"-,"(注意末尾逗号);
- 字段首字母必须大写(即导出字段),否则即使有正确标签也无法被 json 包访问;
- 标签中的空格、引号不匹配、拼写错误(如 josn:"-")均会导致标签被忽略;
- 若需条件性忽略(如仅当字段为空时省略),应使用 omitempty(如 json:"baz,omitempty"),而非 -。
总结:json:"-" 是最彻底的忽略方式,但务必确保标签语法精准无误——这是 Go 结构体标签解析的通用要求,也是初学者易踩的典型陷阱。










