piapia123
zh

JSON 转 TypeScript / Go / Java / Rust 代码

格式化

所有处理都在浏览器本地完成,数据不上传服务器

输入
输出

贴一段 JSON 样本,直接拿到可以粘进项目的类型定义。它不是把键名照抄一遍:同一个键在不同元素里类型不同会退化成联合类型(没有联合类型的语言退到 interface{} / Object / serde_json::Value),只在一部分元素里出现的键会标成可选,结构完全相同的嵌套对象合并成同一个类型而不是生成一堆长得一样的声明。字段名按目标语言的规范转换,原始键名通过 json tag / serde rename 保留下来。

功能

  • 四种目标语言:TypeScript interface、Go struct、Java class、Rust struct
  • 数组里缺失的键标成可选(TypeScript 的 ?、Go 的指针加 omitempty、Rust 的 Option)
  • 同一位置出现不同类型时生成联合类型,而不是随便挑一个
  • 结构相同的嵌套对象合并成一个类型,重名但结构不同的才加序号
  • 字段名按目标语言转换:Go 导出名加 json tag、Java 驼峰、Rust 下划线加 serde rename
  • 非法键名按各语言规则处理:TypeScript 加引号,其余语言改写字段名并保留原始键名
  • Go 的键名含反引号时自动改用双引号形式的标签,避免结构体标签被截断
  • Java 只让根类带 public,整段输出可以贴进同一个文件
  • 超过 64 层的嵌套退化成任意类型,不会生成无法阅读的类型
  • 根类型名可自定义,填了非法标识符会自动规范化

使用方法

  1. 把覆盖尽可能多分支的 JSON 样本粘贴进输入框
  2. 选择目标语言
  3. 填写根类型名,并决定是否把可空字段标成可选
  4. 按 Ctrl/⌘ + Enter 或点「运行」,再点「复制」取走结果

常见问题

生成的类型准确吗?
准确度取决于样本。同一个键只出现过一种取值时,工具分不清「这次是这样」和「类型就是这样」,所以样本最好覆盖各种分支:同时出现 null 与非 null、同时出现整数与小数、数组里多放几个结构不同的元素。生成后手工放宽比从零写要快得多。
为什么有些字段带了问号或指针?
因为它在样本里不是每个元素都有,或者出现过 null。把「可选字段」开关关掉,就会全部按必填输出——但在真实数据上可能读不出来。
null 会生成什么?
TypeScript 里并入类型(string | null),勾了可选字段还会同时加 ?;Go 用指针,Rust 用 Option,Java 用包装类型(Integer、Boolean、Double)。
我的 JSON 会被上传吗?
不会。解析、类型推导与代码生成全部在浏览器内存里完成,页面不发任何请求,断网状态下同样可用。

相关工具