跳到正文

JSON 转 TypeScript、Go、Python 等类型

粘贴 JSON 示例,即可在浏览器中生成 TypeScript 接口、Zod schema、Go 结构体,以及 Python、Java、C#、Kotlin、Swift 和 Rust 类型。

多个样本(依次排列或 JSON Lines)以及数组中的对象会被合并:在某处缺失的键会变为可选,null 值会变为可空。

TypeScript
粘贴样本,然后点击“生成类型”。
声明为
在浏览器中运行 · 无需上传工作原理

JSON 转类型 使用方法

  1. 1

    粘贴 JSON 样本

    粘贴一个响应、一组记录的数组,或连续粘贴多个响应;示例中展示了两个合并后的用户。

  2. 2

    选择语言

    选择 TypeScript、Zod、Go、Python、Java、C#、Kotlin、Swift 或 Rust,并设置对应的风格选项。

  3. 3

    命名根类型

    设置顶层类型的名称,例如 User 或 OrderResponse。

  4. 4

    生成并复制

    点击“生成类型”,然后复制代码或下载;修改设置后会自动重新生成。

限制与 Pro

免费使用,无需注册:支持 9 种输出语言和 3 种 Python 风格,合并样本数量不限,文件最大 20 MB,生成超过 30 秒会停止。

Pro 可去除广告;所有方案的生成器功能相同。 了解 Pro

关于 JSON 转类型

为 API 响应手写类型既慢又容易出错,尤其是数据嵌套了三层的时候。粘贴一个或多个 JSON 样本,这个生成器会推断数据结构,并输出可直接粘贴使用的定义,支持九种形式:TypeScript 接口或类型别名、带 Zod 校验模式的 TypeScript、带 json 标签的 Go 结构体、Python 的 dataclass、TypedDict 或 Pydantic v2 模型、带 Jackson 注解的 Java record、适用于 System.Text.Json 的 C# 类、适用于 kotlinx.serialization 的 Kotlin 数据类、Swift 的 Codable 结构体,以及适用于 serde 的 Rust 结构体。

单个样本很难展示所有字段,所以生成器会合并你提供的全部样本。你可以连续粘贴多个文档、使用 JSON Lines,或粘贴对象数组:只在部分对象中出现的键会变成可选,有时为 null 的键会变成可空,有时带小数的整数会变成浮点数,真正类型混杂的值会变成联合类型或该语言的动态 JSON 类型。嵌套对象会生成各自命名的类型,例如 orders 变成 Order,addresses 变成 Address,结构相同的类型只生成一次并复用。键为数字、UUID 或日期的对象会转成映射。

字段名会按各语言的习惯转换,而 first-name、class 这类不同的 JSON 键,会用对应的注解、别名或 CodingKeys 映射回去。样本中的注释和末尾逗号也能正常处理。

输出结果只描述你提供的样本;生成器无法得知样本里没有的字段或取值,所以在正式使用前,请对照 API 文档检查。

隐私

样本的解析和代码生成都由当前标签页中的 Web Worker 完成,包含个人或内部数据的 API 响应不会被上传。语言和命名选项保存在本地存储中,粘贴的 JSON 不会被保留。

功能

合并多个样本

在你粘贴的所有样本中,缺失的键变为可选,值为 null 的字段变为可空。

支持 9 种语言

TypeScript、Zod、Go、Python、Java、C#、Kotlin、Swift 和 Rust,命名符合各语言习惯。

自带键名映射

json 标签、别名、@SerialName、@JsonProperty 和 CodingKeys 会保留原始 JSON 键名。

JSON 转类型:常见问题

它如何判断哪些字段是可选的?
只要该位置的对象中至少有一个不包含某个键,这个字段就是可选的。如果只粘贴单个对象,所有字段都会是必填,因为没有任何信息表明并非如此。请粘贴多个真实响应或记录数组,让生成器看出哪些键有时出现、有时缺失。“将所有字段设为可选”适用于部分更新或 patch 请求的数据。
某个值有时为 null 会怎样?
该字段会变成可空类型:TypeScript 中是 string | null,Go 中是指针,Python 中是 str | None,Kotlin 和 Swift 中是 String?,Rust 中是 Option<String>,Java 和 C# 中是装箱或可空类型。如果某字段在所有样本中都是 null,就无法推断类型,会变成该语言的未知类型或动态 JSON 类型。
为什么我的整数变成了浮点数?
如果同一字段在一个样本中是 7,在另一个样本中是 7.5,类型就必须同时容纳两者,因此会变成 float 或 double。带小数点的写法,例如 10.0,也会被视为小数。在 TypeScript 中两者都是 number;使用 Zod 时,只含整数的字段会用 z.number().int() 校验。
它和 quicktype 一样吗?
两者解决的是同一个问题,但它使用自己的生成器,完全在浏览器中运行,并多了几项功能:包括 TypedDict 在内的三种 Python 风格、Zod 校验模式,以及合并多个粘贴的文档。quicktype 支持更多语言,也能读取 JSON Schema。对于这里的九种语言,生成的代码无需额外的运行时辅助库即可编译。
它能识别日期、枚举或 UUID 吗?
不能。字符串始终保持为字符串,因为少量样本无法证明以后的每个值都是日期或某个固定集合中的值。如果你的 API 能保证,请手动把生成的类型改为 Date、time.Time、datetime、枚举或 UUID 类型。键为 UUID、数字或日期的对象是例外:它们会变成映射。