JSON 转代码生成器
JSON从 JSON 生成 TypeScript、Java、Go、C# 实体类型,自动推断嵌套对象与数组。
不获取远程 URL;请直接粘贴你的 JSON。
本页内容
什么是 JSON 转代码生成器?#
JSON 转代码生成器读一份示例 JSON,推断出数据的形状——哪些字段是字符串、哪些是数字、哪些是嵌套对象、哪些是什么东西的数组——然后写出真实程序里用来承载这份数据的实体类型。你不用再为了匹配一个 API 响应,手工敲一份 TypeScript 接口、Java 类、Go 结构体或 C# 类:粘一个示例响应,就能拿到可以直接落进项目的类型定义。
它内部遍历解析后的值、推断 schema。嵌套对象会变成各自的命名类型;数组元素的类型是所有元素形状的合并(所以一组各带不同字段的对象,依然会产出一个把字段并起来的类型)。不是合法标识符的字段名——带连字符的键比如 first-name、或以数字开头的键——会被清洗成合法标识符,而原始键作为序列化注解保留下来,这样往返反序列化照样能工作。
产出的是纯文本源码,对本页没有任何运行时依赖。复制、粘进你的代码库、调一下类型名,你就有了起点——不是成品模型,但枯燥的骨架已经替你写好了。
怎么使用#
- 用 语言(Language)下拉选目标:TypeScript、Java、Go 或 C#。
- 设置 根名(Root name,默认
Root)。它会成为最外层类型的名字——比如User、Order、Response。 - 把 JSON 粘进左侧。生成的代码实时出现在右侧;状态栏报告错误(非法 JSON、空输入)。
- 点 复制(Copy)把代码取到剪贴板。
- 点 示例(Sample)载入一个带子对象和数组的嵌套对象;点 清空(Clear)重置两边。
主要特性#
- 四种目标语言。 TypeScript 接口、Java 类、Go 结构体、C# 类——一份输入,四种产出,下拉切换。
- 推断 schema,而非照字面抄类型。 嵌套对象变成命名类型;对象数组会产出一个命名的元素类型,而不是一个说不清道不明的
any列表。 - 异构数组合并。 数组元素字段不一致时,推断出的类型是它们的并集——对真实世界里并非每条记录都全字段的情况很实用。
- 标识符安全、键忠实。 不是合法标识符的键会被清洗,原始键作为序列化注解保留(
@JsonProperty、Go 的json:tag、JsonPropertyName),所以原始 JSON 仍能正确反序列化。 - 实时且本地。 生成在你浏览器里随输入、随选项切换实时跑,数据不离开本页。
实例演示#
语言 选 TypeScript、根名 设为 Root,点 示例,输入是:
{
"id": 1,
"name": "Ada",
"active": true,
"address": { "city": "London", "zip": "NW1" },
"tags": ["math", "logic"]
}
生成器产出两个接口——根类型,以及为嵌套对象命名的 Address 类型:
export interface Root {
id: number;
name: string;
active: boolean;
address: Address;
tags: Array<string>;
}
export interface Address {
city: string;
zip: string;
}
把语言切到 Go,同一份输入变成带 json: tag 的结构体,tag 把原始键保留下来:
package model
type Root struct {
Id float64 `json:"id"`
Name string `json:"name"`
Active bool `json:"active"`
Address Address `json:"address"`
Tags []string `json:"tags"`
}
type Address struct {
City string `json:"city"`
Zip string `json:"zip"`
}
注意 id 这个 JSON 数字,在 TypeScript 里落成 number,在 Go 里落成 float64——生成器不去猜整数还是浮点,因为 JSON 本身就不区分。
常见问题#
为什么我的整数字段被类型化成了 float64 / Double / double?#
因为 JSON 只有一种数字类型,没法区分 5 和 5.0。生成器把每个 JSON 数字映射到目标语言的通用数字类型——TypeScript 的 number、Java 的 Double、Go 的 float64、C# 的 double——这样类型总是足够宽,能装下值实际可能的样子。如果你确知某字段总是整数,之后手动收窄成 int / Long / int64 即可。
我的数组里各对象字段不完全一样,会怎样?#
它们的形状会被合并。像 [{ "a": 1 }, { "a": 2, "b": "x" }] 这样的数组,会产出一个同时含 a 和 b 的元素类型,一个类型覆盖所有条目。如果两个元素在某字段的类型上不兼容地冲突(比如这里是数字、那里是字符串),那个字段会降级成 any / Object,而不是随便选一边、对另一边说错。
我的 JSON 里有个字段带连字符,比如 first-name,会出问题吗?#
不会。生成器把 first-name 转成合法标识符(firstName)作为字段名,并发出一条记录原始键的序列化注解——Java 里是 @JsonProperty("first-name")、Go 里是 json:"first-name" tag、C# 里是 [JsonPropertyName("first-name")]、TypeScript 里是带引号的 "first-name" 键。所以生成的代码能原样反序列化原始 JSON。
遇到 null 值会怎么处理?#
值为 null 的字段被当作类型未知。TypeScript 里变成可选的 any(field?: any;);Java 和 C# 里变成 Object / object;Go 里变成 interface{}。这是有意的信号——null 没告诉你这个字段在它有值的时候到底装什么,所以生成器拒绝瞎猜,留给你来填。