MiServe DevTools

我的贴纸

把工具固定在这里,会保存在此浏览器中。

JSON 转 Go 结构体和 TypeScript 类型

把 JSON 示例转换为 Go 结构体、TypeScript interface 或 type,或者 JSON Schema,并识别可选键、null 和日期。

在浏览器中运行。粘贴的内容不会被上传。

关于此工具

从示例中能推断出什么

工具会遍历 JSON 值,记录每个位置上出现的内容。数组的各个元素会合并成一个描述:部分对象缺少的键成为可选,有时为 null 的值成为可空,包含不同类型值的数组在 TypeScript 中成为联合类型,在 Go 中成为 []any。

只有当某个数字的每个取值都不带小数点或指数、并且在有符号 64 位整数范围内时,它才是整数;否则就是浮点数。只有当某个字符串的每个取值都是 RFC 3339 日期时间(例如 2026-11-14T10:00:00Z)时,它才会成为日期时间。只有日期、没有时间的值仍是字符串。

每个嵌套对象都会得到一个以其键命名的类型。对于数组元素,如果键是普通的英语复数形式,名称会变为单数,所以 users 得到 User,categories 得到 Category;否则会在后面加上 Item。启用内联嵌套类型后,嵌套对象会直接写在父类型内部。

Go 输出

字段名都是导出的,并遵循 Go 对首字母缩略词的约定,所以 user_id 变成 UserID,html_url 变成 HTMLURL,而 json 标签保留原始的键。整数为 int;当某个取值超出 32 位范围时则为 int64,因为 Go 规范允许 int 只有 32 位宽。其他数字为 float64,日期时间为 time.Time。1 和 1.0 的区别很重要:encoding/json 拒绝把 1.0 解码到 int 字段中。

打开为可选字段添加 omitempty 后,在部分对象中缺失的键会在标签中带上 omitempty,并保持普通类型。可能为 null 的标量或结构体会变成指针,例如 *string,以便区分 null 和零值;切片或 map 不需要指针,因为它本身就可以是 nil。始终为 null 的值会变成 any。可选的嵌套结构体和可选的 time.Time 字段也会变成指针,因为 omitempty 从不省略结构体值。各列按 gofmt 的方式对齐。

有些键无法绑定到结构体字段。json 标签无法表示空键,也无法表示包含逗号、引号或反斜杠的键。原版 encoding/json 还会忽略含有字母、数字和常见标点以外字符的标签名,因此带有组合字符或 emoji 的键只能由基于 encoding/json/v2 的实现匹配。如果示例中有这样的键,工具会在输出下方列出它们。

TypeScript 和 JSON Schema 输出

在 TypeScript 中,可选键写作 ?:,可空值写作 | null,不是有效标识符的键会加上引号。日期时间的类型是 string,因为 JSON.parse 返回的就是字符串,并附有一条注释加以标明。interface 和类型别名两种形式描述的是同一个结构,按你的代码库的习惯选择即可。

JSON Schema 输出遵循 draft 2020-12。在所有对象中都存在的键列在 required 下,整数为 integer,日期时间带有 format: date-time,具名对象类型放在 $defs 下,并通过 $ref 引用。

一个示例只反映了某个文档的样子,并不代表 API 可能返回的全部内容。在依赖生成结果之前,请对照 API 的文档检查可选字段和可空字段。

常见问题

工具如何知道某个字段是可选的?

只能从数组中判断。当同一个数组中的对象并不都有相同的键时,至少在其中一个对象中缺失的键就是可选的。单个对象无法提供这种依据,所以它的所有键都被视为必需。

为什么一个数字是 int,另一个却是 float64?

当某个数字的每个取值都不带小数点或指数,并且在 64 位整数范围内时,它的类型是整数。在 Go 中为 int,如果某个取值超出 32 位范围则为 int64。只要有一个取值是 2.5,或者写成了 1.0,该字段在 Go 中就是 float64,在 JSON Schema 中就是 number。TypeScript 对它们一律使用 number。

值为 null 时会怎样?

如果同一字段还有非 null 的取值,类型就会变为可空:在 Go 中是指针,或者是本身就可以为 nil 的切片或 map;在 TypeScript 中是与 null 的联合类型;在 JSON Schema 中是同时接受 null 的 schema。如果唯一的取值是 null,就无从得知真实类型,因此结果在 Go 中是 any,在 TypeScript 和 JSON Schema 中是 null。

我的 JSON 会被发送到服务器吗?

不会。类型由浏览器标签页中的 JavaScript 生成。此工具不会用你粘贴的内容发出任何网络请求,网站的安全策略也会阻止向其他任何主机发出请求。

数据分类的其他工具