跳到内容

🧬 JSON → 类型定义转换

粘贴 JSON 即可自动生成 TypeScript / PHP / Python / Go / Rust 类型定义。支持嵌套对象和数组。

完全免费 无需注册 浏览器内完成 5 种语言 深色模式

💡 使用提示

• 嵌套对象自动提取为独立类型。

• 从数组元素推断类型。空数组变为 any[] / []interface{} 等。

• null 被视为 optional / nullable,如 string | null。

• 从上方输入字段更改根类型名称。

🔗 相关工具

📖 常见的坑

粘贴 JSON 即可生成 TypeScript / PHP / Python / Go / Rust / Kotlin / Swift 的类型定义,嵌套对象会被抽取为独立类型,也会从数组元素推断类型。处理全部在浏览器内完成。能推断出来的,只有你提供的样本中出现过的形状——一条 API 响应只是「那一次返回的样子」,而不是规格。请把产出视为供手工修改的起点,而非成品。

情形 会发生什么 怎么处理
用一条样本生成的类型,上线后对不上 推断的前提是「看到的就是全部」。因此样本中未出现的字段在类型里根本不存在,而恰好有值的字段则被当作必填。真实的 API 在搜索结果为 0 条、发生错误、权限不足、以及面对旧记录时,会返回各不相同的形状最尖锐的是枚举型字段:若样本里只出现过 "active",类型就成了字面量 "active"而当 "archived" 到来的那一刻,这个类型就变成了谎言 请多喂几条响应。至少取「正常、空结果、错误、边界值」四种情形,把生成的类型放在一起对照,哪些字段才是真正必填的就浮现出来了若已有 OpenAPI 规格,请改从它生成——openapi-typescriptoapi-codegen 依据的是「所有可能返回的形状」的规格描述,可靠性与「从样本推断」完全不是一个层级而且,生成的类型请务必读一遍——如果得到的类型里所有字段都必填、枚举只有一个字面量,那就是「你只喂了一条样本」的信号
空数组与 null 定不出类型 "tags": [] 这个值,没有任何办法得知元素类型——结果只能是 any[][]interface{}List<Any> 这类「什么都能装」的类型,类型检查的收益荡然无存。null 同样信息不足——"deleted_at": null 究竟是「一直为 null」还是「这次恰好为 null」,从这一条里判断不出来。更根本的是:JSON 能区分「键不存在」与「键的值是 null」,而许多语言的类型系统会把这个区别模糊掉——TypeScript 的 ?:| null 并不是一回事。 当某条响应里出现空数组时,请再喂一条有元素的响应——哪怕只有一个元素,类型就能定下来。如果拿不到,就手写那个数组的类型——把产出看作「自动化九成、剩下的补上」,这点工作就不算负担了。关于 null,只能查 API 文档——若该 API 区分「键不存在」与「值为 null」,在 TypeScript 中把两者都写出来才准确,如 deleted_at?: string | null拿不准就往宽松的一侧倒——「类型宽松 + 运行时校验」比「类型严格 + 运行时崩溃」安全。
数值类型在不同语言中含义不同 JSON 只有一种数值类型——既不区分整数与小数,也不指定精度。因此生成器只能按语言各自选一个:Go 用 float64,Rust 用 i64f64,TypeScript 用 number危险的是 IDfloat64number 接收大整数,一旦超过 2 的 53 次方,精度就丢了,值被悄悄改写9007199254740993 变成 9007199254740992不会报任何错。长得像日期的字符串,自然也仍是 string ID、金额、日期时间,生成之后请务必手工修正类型。ID 当作字符串处理最安全——从不参与运算的值没有理由存成数字(事实上 Twitter 与 Discord 的 API 就把大 ID 以字符串返回)。金额绝不要用浮点——与 0.1 + 0.2 不等于 0.3 是同一个道理,请使用最小单位的整数,或语言提供的 Decimal 类型。把日期时间从 string 改成各语言的日期类型,类型系统就会强制你处理时区请逐行读一遍生成的类型,自问「这个值我会拿来做运算吗」——如果不会,用字符串就好。

不要把生成的类型当成「可信的边界」。尤其是 TypeScript 的类型只存在于编译期,运行时不做任何校验——写下 await res.json() as User无论实际返回的是什么,编译器都相信它是 User。这不是类型系统的缺陷,而是「边界处的校验属于另一层的职责」这一设计。对于来自外部的数据——API 响应、表单输入——请务必加上 zodvalibot 这类运行时校验;类型可以从 schema 推导出来,因此并不会造成双重维护。Go 的 json.Unmarshal 与 Rust 的 serde 确实会校验,相对安全,但默认会静默丢弃未知字段——Go 用 DisallowUnknownFields、Rust 用 #[serde(deny_unknown_fields)]就能在 API 变更时察觉到。

📖 使用方法

  1. 1
    输入或粘贴 JSON
    将 JSON 粘贴到左侧输入框。点击示例按钮快速加载示例数据。
  2. 2
    选择目标语言
    选择 TypeScript、PHP、Python、Go、Rust、Kotlin 或 Swift,并可修改根类型名称。
  3. 3
    复制并使用类型定义
    右侧显示自动生成的类型定义。点击复制按钮将其复制到剪贴板并粘贴到代码中。

❓ 常见问题

嵌套对象如何处理?
嵌套对象自动提取为独立类型定义并按名称引用。
null 字段如何定义类型?
null 字段被视为 optional/nullable,根据语言转换为 Optional、? 或指针类型。
支持顶层 JSON 数组吗?
是的。如果根是数组,自动包装为 { items: [...] } 进行类型生成。
🐛 此工具出现问题了吗?

免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。

※ 为复现问题,浏览器信息 (UA / 屏幕 / 语言 / URL) 将自动发送