🧬 JSON → 类型定义转换
粘贴 JSON 即可自动生成 TypeScript / PHP / Python / Go / Rust 类型定义。支持嵌套对象和数组。
💡 使用提示
• 嵌套对象自动提取为独立类型。
• 从数组元素推断类型。空数组变为 any[] / []interface{} 等。
• null 被视为 optional / nullable,如 string | null。
• 从上方输入字段更改根类型名称。
🔗 相关工具
📖 常见的坑
粘贴 JSON 即可生成 TypeScript / PHP / Python / Go / Rust / Kotlin / Swift 的类型定义,嵌套对象会被抽取为独立类型,也会从数组元素推断类型。处理全部在浏览器内完成。能推断出来的,只有你提供的样本中出现过的形状——一条 API 响应只是「那一次返回的样子」,而不是规格。请把产出视为供手工修改的起点,而非成品。
| 情形 | 会发生什么 | 怎么处理 |
|---|---|---|
| 用一条样本生成的类型,上线后对不上 | 推断的前提是「看到的就是全部」。因此样本中未出现的字段在类型里根本不存在,而恰好有值的字段则被当作必填。真实的 API 在搜索结果为 0 条、发生错误、权限不足、以及面对旧记录时,会返回各不相同的形状。最尖锐的是枚举型字段:若样本里只出现过 "active",类型就成了字面量 "active",而当 "archived" 到来的那一刻,这个类型就变成了谎言。 |
请多喂几条响应。至少取「正常、空结果、错误、边界值」四种情形,把生成的类型放在一起对照,哪些字段才是真正必填的就浮现出来了。若已有 OpenAPI 规格,请改从它生成——openapi-typescript、oapi-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 用 i64 或 f64,TypeScript 用 number。危险的是 ID:用 float64 或 number 接收大整数,一旦超过 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 响应、表单输入——请务必加上 zod、valibot 这类运行时校验;类型可以从 schema 推导出来,因此并不会造成双重维护。Go 的 json.Unmarshal 与 Rust 的 serde 确实会校验,相对安全,但默认会静默丢弃未知字段——Go 用 DisallowUnknownFields、Rust 用 #[serde(deny_unknown_fields)],就能在 API 变更时察觉到。
📖 使用方法
-
1
输入或粘贴 JSON将 JSON 粘贴到左侧输入框。点击示例按钮快速加载示例数据。
-
2
选择目标语言选择 TypeScript、PHP、Python、Go、Rust、Kotlin 或 Swift,并可修改根类型名称。
-
3
复制并使用类型定义右侧显示自动生成的类型定义。点击复制按钮将其复制到剪贴板并粘贴到代码中。
❓ 常见问题
嵌套对象如何处理?
null 字段如何定义类型?
支持顶层 JSON 数组吗?
🐛 此工具出现问题了吗?
免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。
感谢您的反馈!
已送达运营者,将用于改进工具。