JSON 转实体类

按响应 JSON 推断类型,生成 TS、Java、Go、C#、Kotlin 的结构体。

输出序列化注解(JSON tag / 注解)null 字段标为可空
输入
输出

类型模型是多份样本合并出来的:把所有样本 JSON 逐层对齐成一张「键 → 类型观测」的表,每个字段记录出现过的类型集合、是否缺失过、数组元素的合并结果;数组元素类型取所有元素的并集,纯标量数组直接生成 string[] / List<T> 之类。对象按结构哈希去重——两个类所有字段的键名和类型结构完全一致时只定义一次,其余位置复用同名类,复用关系会写进提示。

可选性与可空性遵循 quicktype 的口径:字段只要在某一份样本里缺席过就推断为可选,值为 null 则加进类型联合。数字不做臆测:整数按最小宽度给(各语言统一用 64 位整型,避免 int32 溢出),一旦出现小数或同一字段混合 int/double 就取浮点类型;JSON.parse 后 !Number.isSafeInteger 的大整数会标注「超出双精度安全范围」,提示你可能已经丢精度,此时应回源改字符串传输而不是指望生成器救回来。日期不自动转型,类型仍是 string;类型冲突(同一键既有字符串又有对象)会如实报告联合类型而不是猜一个。

JSON 转实体类怎么用

  • 多样本输入:每份 JSON 之间空一行分隔;贴得越多,可选字段和联合类型判得越准。只有一份样本时所有字段都按「必需」处理,注意这点偏差。
  • 选项:lang 切换 ts/java/go/csharp/kotlin;naming 选成员名用 PascalCase 还是 camelCase;tag 控制是否输出序列化特性(@JsonProperty、json 标签、@SerialName、JsonPropertyName、TS 注释里的原字段名);nullable 决定是否把缺键推断为可空。字段被判为可选时各语言的写法是:TS 加 ?,Java 用包装类型 + NON_ABSENT,Go 用指针 + omitempty,C# 加 ?,Kotlin 给 = null。「nullable」开关关掉后只按样本里的显式 null 判可空,缺键仍按缺席处理。
  • 成员名清洗与保留字:naming=pascal/camel 决定成员名风格,键名含 -、_、空格或数字开头时先拆词清洗再生成合法标识符,原始键名保留在特性标签(tag 开关)里;各语言的保留字会加下划线后缀避让。
  • 看提示再落地:输出上方的横幅列出生成的类、去重合用、精度警告和类型冲突。形如 2024-01-01 或 ISO 时间戳的字符串只会作为 format 候选写进注释,是否换成 Date/LocalDate 交给你决定。生成代码是起点不是终点:命名、分包、构造器请按项目规范再整理。

常见问题

为什么我的字段变成可选了?

至少一份样本里没有这个键。推断器无法区分「这个字段可以缺」和「恰好这几条数据没带」,所以宁可判可选,生成的代码也就不会在缺键时炸掉。确信字段必然存在的话,把缺键的那份样本去掉,或手动去掉 ? / 指针。

数字精度与 int64 有什么坑?

JSON 只有一个数字类型,浏览器 JSON.parse 一律得到 IEEE 754 双精度,安全上限是 2^53-1。雪花 ID、微秒时间戳这类超过 9007199254740991 的值在粘贴进来的瞬间就可能已经丢了末位——本工具能检测并提示,但救不回原始数字。根治办法是让服务端把大整数写成字符串。同一字段混着整数和浮点时,各语言统一放宽到 double/float64。

为什么日期没有生成 Date 类型?

"长得像日期" 和 "语义是日期" 是两回事:一个字符串可能是 ISO 时间戳,也可能是单号恰好是这个形状。自动转 Date 会让生成的类反序列化失败或引入时区问题,所以本工具只在注释里标注「疑似 date/date-time 格式」,类型保持字符串,换不换由你判断。

对应功能编号 #102无需安装,手机端同样可用按 Ctrl + K 换工具