JSON 处理
标准库 encoding/json 基于反射与结构体标签实现 JSON 与 Go 类型的互相转换,是 API 开发中最高频的技能之一。
编码:Marshal
常用结构体标签
Tip
未加标签的字段默认以原字段名输出(大写开头)。对外 API 应始终显式声明 json 标签,避免暴露内部命名。
格式化输出
MarshalIndent 与 Encoder.SetIndent 可生成带缩进的 JSON,适合配置输出与调试:
解码:Unmarshal
动态 JSON:any 与 json.RawMessage
结构不确定时使用 map[string]any 或延迟解析:
流式编解码:Decoder / Encoder
处理 HTTP 请求体、文件或网络流时,使用 json.Decoder/json.Encoder 直接读写流,无需全量加载:
时间与自定义编解码
time.Time 实现了 MarshalJSON/UnmarshalJSON,默认输出 RFC 3339 格式。自定义类型可实现 json.Marshaler 与 json.Unmarshaler 接口:
:::warning 常见陷阱:
- 数字默认解码为
float64,大整数场景应使用json.Number或结构化类型。 Unmarshal忽略未知字段;需要严格校验时使用Decoder.DisallowUnknownFields()。- 结构体字段首字母必须大写(可导出)才会参与编解码。 :::
小结
- 结构体标签是控制 JSON 字段名与省略行为的核心。
- 固定结构用结构体,动态结构用
map[string]any或json.RawMessage。 - 流式场景使用
Decoder/Encoder,避免大对象全量驻留内存。