JSON 转 TypeScript / Go
贴一段 JSON,直接得到能用的 interface 或 struct,省去对着接口返回手敲字段的功夫。
输入 JSON
生成的类型定义
字段合并规则
输入是数组时,会把所有元素的字段取并集。某个字段只出现在一部分元素里,TypeScript 输出会标成可选(
?),Go 输出会加
,omitempty。类型不一致的字段生成联合类型,例如 string | number。
怎么用
选输出语言(TypeScript 或 Go)、选命名风格、填根类型名,然后贴 JSON,输出会自动刷新。
根类型名默认 Root,建议改成接口的语义名,例如 User、OrderDetail。嵌套对象按字段名推导子类型名:{"user":{"name":"x"}} 会生成一个 User 子接口。数组里的对象合并成一个类型,用字段名单数形式派生名字(orders → Order)。
常见坑
- 生成的类型只是「这份样例」的形状。样例里字段是 null、数组是空的,推断结果一定片面,合进项目前请手工过一遍。
- 数字无法区分
int和float。TypeScript 一律number;Go 里1生成int,1.5生成float64,但 JSON 里的1.0和1完全一样,都会生成int。 - 字段名转换只做风格调整,不保证语义正确。
user_id会变成userId,但id不会变成ID。 - Go 里动态键的对象生成
map[string]any,需要 Go 1.18 以上。 - 键名带
"、\这类字符时,生成的代码里已经做好转义,不必手工处理。 - 超过 2^53 的整数在 JSON.parse 阶段就已经被 JavaScript 截断,请先把这类 ID 改成字符串再生成。
常见问题
数组里多个对象的字段不一样,生成的类型以谁为准?
取并集。例如第一个元素有
a、第二个有 a 和 b,结果里 b 会被标成可选。这样线上返回缺字段时类型不会突然报错,也提醒你代码里要做空值判断。生成的 Go struct 字段名和 JSON 键对不上怎么办?
字段名按命名风格转换,但
json:"user_name" 标签里始终是原始键名,序列化和反序列化完全不受影响。选「保持原样」时字段名与键名一致,只是不符合 Go 导出规则(首字母大写、去掉非法字符)的地方仍会被自动修正。JSON 里的 null 会生成什么类型?
默认生成
null(Go 里是 any),因为只有 null 的样例确实推不出真实类型。勾选「null 视为可选」后会按未知类型处理并标记成可选字段,适合「这个字段可能没有」的接口。空数组的字段会生成什么类型?
生成
any[],Go 里是 []any,因为没有元素可供推断。想要准确类型,就把样例里的数组换成有真实元素的内容,或者生成后手工替换掉。键名里带短横线或中文,能生成合法代码吗?
能。TypeScript 里
{"user-name":1} 生成 "user-name": number;,带引号的属性名是合法语法。Go 里中文和短横线不能做字段名,工具会转成合法标识符,并在 json 标签里保留原键名。