跳到主要内容

JSON 转 TypeScript Interface — 自动识别 union 与可选字段, 零上传

JSON 转 TypeScript interface, 粘 JSON 出干净 interface, 数组元素合并为 union, 可选字段自动识别, 根类型名可命名。

  • 本地处理
  • 分类 开发运维
  • 适合 格式化、校验、压缩或检查和代码相关的文本。
示例:
union 和可选字段是怎么识别的

数组里形状不一样的对象会被合并成一个 interface: 某一个样本里缺的 key 会被标成可选 (?); 标量类型会叠成 union (number | string | null)。开启"严格"会忽略数组采样直接把所有 key 都标成必需, 适合你这段 JSON 本身就是唯一真相而不是采样列表的场景。

这个工具能做什么

把任意 JSON (GitHub API 响应, Stripe webhook, GraphQL data 块, 配 置文件) 粘进来, 拿到一个干净的 .ts 文件, 里面是一组 `export interface` 声明, 可以直接拖进项目里 import。推断器会读对象每个 key, 把数组里多个 object 合并成一个带 union 的 interface, 缺一 个样本的 key 会被标成 `?`, 非合法标识符 key 会自动加引号, 根类 型名也可以改成你想 import 的名字。可切换 interface 还是 type 别名, 字段是否加 readonly, 回退到 unknown 还是 any, 以及"严格 模式"(把所有 key 都标必需, 不按数组采样推断)。100% 浏览器本地, JSON 不出标签页。

工具细节

输入
文本 + 数值 + 结构化内容
页面会根据工具类型展示文本框、数值控件、文件选择或结构化输入。
输出
即时结果 + 复制 + 下载
结果区优先给出可操作结果,支持项会显示复制、下载或可视化预览。
隐私
浏览器本地处理
主工具逻辑未发现外部 API 调用,输入通常留在当前标签页内处理。
保存 / 分享
可分享链接状态
关键设置会进入 URL,复制链接后别人能复现同一组参数。
性能预算
首屏 JS ≤ 25 KB
没有声明 WASM 依赖,适合快速打开和移动端使用。
适用场景
开发运维 · 程序员
分类和职业标签用于推荐相关工具、组织内链,并帮助用户快速判断是否适合当前任务。

怎么用

  1. 1. 输入

    把内容粘贴或拖入工具面板。

  2. 2. 处理

    点击按钮,在浏览器内本地处理,文件不上传。

  3. 3. 复制 / 下载

    一键复制结果或下载到本地。

JSON 转 TypeScript Interface 适合怎么用

适合穿插在写代码、查问题、做 Review、上线前的小任务里。

适合开发场景

  • 格式化、校验、压缩或检查和代码相关的文本。
  • 把片段整理好再放进文档、工单、提交或交接材料。
  • 不切换工具,快速检查一个小 payload。

开发检查项

  • 压缩、混淆这类不可逆处理,先对副本操作。
  • 除非确认工具本地处理,不要粘贴密钥和敏感片段。
  • 转换后的代码上线前,仍要跑自己的测试或 lint。

下一步可以接着做

这些入口会把当前任务接到更完整的工具链里。

  1. 1 JSONPath / JMESPath 查询测试器 JSONPath / JMESPath 查询测试器, 粘 JSON 写 query, 实时看到匹配值 + 路径在原 JSON 中高亮。 打开
  2. 2 JSON 转 Go 结构体 JSON 转 Go struct, 粘 JSON 出带 json tag 的结构体, 字段自动导出, 嵌套对象生成子 struct, 可空字段用指针, 支持 int64 与 omitempty。 打开
  3. 3 JSON 格式化与校验 浏览器内即时格式化、校验、压缩 JSON,数据不离开本地。 打开

真实使用场景

  • 接 GitHub / Stripe API 时不再手写类型

    第一次接 GitHub API, 文档列了 user 对象的 40 个字段。curl 一次 拿到响应, 粘进来, 根名设为 `GitHubUser`, 复制输出到 `src/types/github.ts`。嵌套的 `plan` 对象自动变成 `GitHubUserPlan` 子接口。现在 `fetch('/user').then(r => r.json() as Promise<GitHubUser>)` 有真正的自动补全 —— 明年 GitHub 加字段, 重新粘一次, diff 文件 就能看到差异。

  • 给 Postgres `row_to_json` 查询出类型

    有一个 SQL 用 `row_to_json(addr)` join 出嵌套对象, 一行一个 record。 跑一次, 复制 JSON 列, 粘进来, 根名设为 `OrderRow`。地址子 对象会自动抽出来 `OrderRowAddress`。现在 `db.query<OrderRow[]>(sql)` 返回的就是和 SQL 形状完全对齐的类型化数组 —— 不会再有手写 interface 和 SQL 渐渐漂走的事。

  • 给还没定形的 webhook payload 推类型

    某个第三方 (Slack / Linear / Vercel) 推 event 过来, 文档过时 已久。把前 3 次的 payload 记下来, 作为一个 JSON 数组粘进来, 可选字段识别会把"不是每次都有"的字段标出来。出的 interface 不仅告诉你形状, 还告诉你哪些 key 永远在、哪些只是有时候有 —— 这比文档里写"这个字段有时候在"有用得多。

  • 老代码 any → unknown 的迁移

    老代码里 `const data: any = await res.json()`, 满天飞 any。挑 一个有代表性的响应粘进来, 生成类型, 把 `any` 替换成新接口。 每个 endpoint 重复一次。运行时没动, 只是给下一个接手的同事 留下一份"响应真实长什么样"的地图。

  • 给新人留下内部 JSON-RPC 协议的文档

    团队内部 RPC 有 `methods.json` 规范, 但响应形状从来没标过类型。 每个示例粘进来, 生成 `RpcGetUserResponse`、 `RpcListOrdersResponse` 等, 提交到 `packages/rpc-types/`。 新人现在 Cmd 点击任何一个 RPC method 都能看到响应的精确形状 —— 原本散落在 Slack 里的工程惯例搬进了类型系统。

  • 不接 codegen 也能给 GraphQL 响应出类型

    有一个一次性的 GraphQL query, 没必要为它接 codegen (小项目 / 原型 / 边角脚本)。在 playground 跑一次, 复制 `data` 字段, 粘 进来, 根名 `ViewerData`。能拿到 `data.viewer.repositories.nodes[0].name` 的自动补全, 5 秒搞定, 不用配 `.graphqlconfig`。

常见踩坑

  • 粘一个对象进来然后期待出可选字段。单个 object 根没有模糊性, 所有 key 都是必需的。可选字段推断只在 "多个 object 组成的数组" 里生效 (有的元素有 key、有的没有)。如果你想从一个 object 出全可选的 interface, 把 JSON 包成 `[{...}]` 再粘。

  • 忘了 JSON 数字一律变成 `number` —— 没有 int / float 区分。一个永远是 `42、43、44` 的字段类型还是 `number`, 不是字面量 `42 | 43 | 44`。需要更窄的类型用运行时校验器 (zod、valibot)。

  • 把输出当成 JSON Schema 用。它只是 TypeScript 类型, 没有生成校验器。输出告诉编译器期望什么形状, 但运行时 API 完全可以返回任何垃圾 TS 也不会发现。在网络边界配一个运行时校验器。

  • 粘十几兆的 JSON 然后嫌没立刻出结果。推断本身是 O(n), 但 React 重渲不免费。大 payload 先采样到 100 KB 左右 —— 推出来的形状一样。

  • 粘 JSON5 / 带注释的 JSON 进来吃 parse error。我们用严格的 `JSON.parse` —— 末尾逗号、注释、不带引号的 key 都会失败。先剥掉, 或者借 YAML → JSON 工具走一道 (YAML 是兼容注释的 JSON 超集)。

  • 根名设成 `user_data` 这种不是 PascalCase 的。工具会自动转 (`UserData`), 但如果你想保留 snake_case 用作导出名是做不到的 —— TS interface 名按社区约定就是 PascalCase, 我们强制一下省得后面 lint 报警。

隐私说明

你粘进来的 JSON 不会离开这个浏览器标签页。文本框内容刻意不写 进 URL —— 只有选项 (根名、声明形式、readonly、unknown-as、严格) 会通过 `useUrlState` 同步到 URL。这意味着 "分享配置" 链接给同 事打开看到的是同样的设置, 但他粘自己的 payload, 不会意外继承 你的。解析和推断走浏览器内建的 `JSON.parse`, 没有任何网络请求, 没有对文本框内容做 analytics, 也不写 localStorage。粘生产 API 响应、内部 payload、客户数据样例、还没发布的 endpoint 规范都 安全。

常见问题

类似工具组合

做你这行的人, 还会一起用这些。

Made by Toolora · 100% client-side · Updated 2026-05-29