JSON 转 Go 结构体完整指南
本工具把 JSON 样例转换成 Go 的 struct 定义,便于对接 API。左侧粘贴 JSON,右侧得到 Go 代码。可设置根结构体名称(默认 AutoGenerated),勾选「添加 omitempty 标签」与「内联类型定义」。提供「转换」「复制代码」「清空」以及示例按钮。字段名会经 toGoName 转成 PascalCase 导出字段,并生成 json:"原键名" 标签。
类型推断规则(与脚本一致)
null→interface{}- 字符串 →
string;布尔 →bool - 数字:整数 →
int64,非整数 →float64 - 数组:空数组 →
[]interface{};否则取首元素推断[]T - 对象:生成命名结构体;开启内联时写成匿名
struct { ... } - omitempty:勾选后标签变为
json:"key,omitempty"
操作步骤
- 粘贴真实接口响应或点示例填充。
- 填写根结构体名(需是合法 Go 标识意图,工具会尽量清洗)。
- 按需要勾选 omitempty / 内联类型,点「转换」。
- 检查字段类型与嵌套结构,点「复制代码」放入项目。
- 用
encoding/json反序列化实测,必要时手动改json.Number或指针字段。
适用场景
- 快速给第三方 API 建模
- 把抓包 JSON 落成后端 DTO
- 教学演示 JSON 与 Go 类型映射
边界与限制
- 数组元素类型以第一个元素为准,异构数组可能不准。
- 大整数超过 JS 安全整数时可能失真(浏览器 JSON.parse 限制)。
- 不会生成校验标签、不会写构造函数或示例 main。
- 同名结构体会尽量去重,复杂图结构仍需人工整理。
常见问题
转换失败提示 JSON 错误?
先保证输入是合法 JSON:键必须双引号、不能有注释与尾逗号。
为什么数字变成 float64?
当 Number.isInteger 为 false 时用 float64。若业务需要定点小数,请手改类型。
内联类型适合什么时候开?
结构浅、只想要一个文件内匿名结构时开启;深嵌套通常关闭以生成多个命名 struct。
会上传我的 JSON 吗?
转换在浏览器本地执行,适合处理未公开接口样例。
字段名里的下划线怎么处理?
user_id 会变成导出字段 UserId 一类 PascalCase,json tag 仍保留原键名。
根是数组怎么办?
若数组元素是对象,会按首元素对象生成结构,并得到切片类型用法;空数组则类型信息有限。
转换管线与按钮对照
左侧 #input 放 JSON,右侧 #output 出 Go。根名在 #structName(默认思路为 AutoGenerated 一类可编辑名)。勾选 #omitempty 会在 json 标签追加 ,omitempty;勾选 #inlineType 时嵌套对象倾向写成匿名 struct { ... } 内联。主流程:convert() → 解析 JSON → jsonToGo / generateStruct → getGoType 推断类型 → toGoName 把键转成导出字段。按钮:#btnPaste 粘贴、#btnConvert 转换、#btnCopy 复制输出、#btnClear 清空。状态文案走 #status 与 showStatus。主题切换 toggleTheme 只影响外观,不改类型规则。
类型细节与改稿清单
null 变 interface{};字符串 string;布尔 bool;整数 int64、非整数 float64;空数组 []interface{},非空按首元素推 []T。粘贴真实响应后请人工核对:金额是否该用定点类型、ID 是否该用 string 防精度丢失、可空字段是否该改指针、时间字符串是否该换成 time.Time 自定义 Unmarshal。异构数组与「有时对象有时 null」的字段,自动推断常不够稳,生成后应用 encoding/json 跑一遍单测再合入仓库。
失败排查与隐私
转换失败多半是非法 JSON:单引号、注释、尾逗号、Python True/False 都不会过 JSON.parse。大整数超过 JS 安全整数会在浏览器侧失真,超大 ID 建议先当字符串样例再手改类型。全流程在本地完成,适合未公开接口样例;公共电脑用完点清空,避免下一位看到业务 JSON。本工具不生成校验 tag、构造函数或完整 main,只交付 struct 草稿。