JSON 转 Go 结构体转换器
粘贴一个 JSON 对象(或 JSON 数组),自动生成对应的 Go struct 定义及 json 标签。
使用小贴士
- 当数组的所有元素都是对象时,会合并各元素的键生成一个 struct。仅存在于部分元素中的键会自动加上 `omitempty` 标签。
- 根类型名称默认是 "Root",可以改成你喜欢的名字。嵌套对象的 struct 名称会根据属性名自动转换为 PascalCase 生成。
- 由于 Go 没有原生的可空基本类型,JSON 的 null 会被转换为 `interface{}`。如需更严格的处理,可以考虑改用指针类型。
- 生成结果只是简单对齐列宽的草稿,粘贴后通过 `gofmt` 处理即可对齐到项目的标准风格。
- 直接粘贴 API 响应的示例 JSON,即可快速得到 Go 中响应结构体的初稿。
常见问题
手工从示例响应编写 struct 既耗时又容易出错,尤其在嵌套层级较深时,容易写错字段名转换或漏写 json 标签。自动生成可以避免这些错误,大幅缩短开发时间。
JSON 键(snake_case 或 camelCase)会被转换为首字母大写的 PascalCase,成为 Go 中可导出的字段名。原始的 JSON 键会原样保留在 json 标签(`json:"原始键"`)中,因此编码解码不受影响。
null 值会被输出为 `interface{}` 类型。仅在数组部分元素中出现的键会自动带上 `omitempty` 标签,但 Go 类型本身只会取零值,如需区分"缺失"与"零值",可以考虑改用指针类型。
含有小数点的 JSON 数值会被判断为 `float64`,不含小数点的则判断为 `int`。由于 JSON 的数值表示只保留位数信息,对于需要 `int64` 的超大数值,请生成后手动调整。
由于 Go 没有联合类型,同一个键在不同元素中类型不一致时会回退为 `interface{}`,需要在运行时用类型断言来判断实际的值类型。
闲话 ― Go 中 struct 与 json 标签的设计
Go 是一门静态类型语言,在处理 JSON 时,标准库的 `encoding/json` 包依赖 struct 字段与 json 标签之间的对应关系来完成编码和解码。手工为外部 API 的响应结构编写 struct 是一项随着字段增多而愈发繁琐的重复劳动,这在许多 Go 项目中反复出现。
这款工具通过解析示例 JSON 的结构,自动生成对应的 struct 定义和 json 标签,从而减轻这类重复工作。同类工具中,支持转换为多种语言类型的 quicktype 颇为知名;但如果只是想粘贴一份示例 API 响应、快速得到一个 Go struct,专注单一功能的工具也自有其便利之处。
由于 Go 没有让 struct 字段变为"可选"的语言特性,对于 JSON 中可能缺失的字段,常见做法是在 json 标签中加上 `omitempty`,或改用指针类型(如 `*string`)来区分零值与"值不存在"。生成的 struct 终究只是根据结构做出的机械推断,将可空性判断和 API 未来变化纳入设计,应当对照实际的接口文档手动调整,这是实践中的通行做法。