
在 go 中,可通过为结构体字段添加 `json:"-"` 标签(注意无空格)来实现反序列化时忽略该字段;若标签写成 `json: "-"`(含空格),则标签解析失败,字段仍会参与解码。
在 Go 的 encoding/json 包中,结构体字段的 JSON 标签(struct tag)用于控制序列化与反序列化行为。要完全忽略某个字段(即在 json.Unmarshal 时不从 JSON 数据中读取其值,也不在 json.Marshal 时输出),必须使用精确的标签格式:
Baz bool `json:"-"`
⚠️ 关键细节:json:"-" 不能包含任何空格。常见错误如 `json: "-"`(冒号后带空格)或 `json:" - "`(带前后空格)均会导致标签解析失败——此时 encoding/json 将退回到默认行为:按字段名(首字母大写导出名)匹配 JSON 键,等效于未设置标签。
以下为修正后的完整示例:
package main
import (
"encoding/json"
"fmt"
)
var data = []byte(`{"bar": true, "baz": true}`)
type Foo struct {
Bar bool `json:"bar"` // 正确映射到 "bar"
Baz bool `json:"-"` // ✅ 正确忽略:反序列化时跳过,值保持零值(false)
}
func main() {
var foo Foo
err := json.Unmarshal(data, &foo)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", foo) // 输出:{Bar:true Baz:false}
}✅ 输出结果为 {Bar:true Baz:false},符合预期。
? 补充说明:
- json:"-" 是唯一能彻底忽略字段的标签形式;
- 其他类似写法(如 json:"baz,omitempty")仅在值为空时省略输出,但反序列化时仍会尝试赋值;
- 若字段未导出(小写首字母),即使无 json:"-" 标签也无法被 JSON 包访问,但这是导出性限制,而非标签控制;
- 建议始终使用 go vet 或 staticcheck 等工具检查 struct tag 语法,避免空格等低级错误。
总之,精准书写 json:"-"(无空格、无引号内空格)是安全忽略字段的唯一可靠方式。










