JSON 转 GraphQL — 从 JSON 生成 GraphQL Schema
从 JSON 数据生成 GraphQL schema 类型定义。处理嵌套对象、数组、可空字段,全部在浏览器中完成,无上传。
JSON to GraphQL Schema
Generate GraphQL schema type definitions from JSON data. Auto-detects types, nullable fields, arrays, and nested objects. Works entirely in your browser.
GraphQL schema 是现代 Web API 设计中最强的契约。它定义了每一种类型、每一个字段、每一个参数和每一种可能的响应形态,客户端和服务端从同一份 schema 生成代码,保证 API 表面保持一致。从一份样例 API 响应手写 schema,是为既有 REST 或 RPC API 引入 GraphQL 的第一步,生成的 schema 充当 resolver 映射的脚手架。生成器遍历 JSON 响应,为每个嵌套对象推断 GraphQL 类型系统,并产出一份 SDL 文件,服务端 resolver 可立即读取。
实践中 GraphQL 最关键的考量是「默认可空」与「默认不可空」。一个不可空字段(String!)等于告诉客户端这个字段总会出现 —— 这是一个服务端必须为每个请求兑现的承诺。把一个不可空字段改成可空,事后看是一次破坏性变更。生成器默认把样本数组每个元素都出现的字段标为不可空,但对会演进的 API 来说更稳妥的做法是所有字段都可空,让客户端优雅地处理缺失值。选项里的「默认可空」开关正是为此存在 —— 如果你的 API 还处在开发阶段、响应形态可能变动,选它即可。
生成 schema 之后最常见的下游步骤是接入代码生成流水线:graphql-codegen 用于 TypeScript 客户端,gqlgen 用于 Go 服务端,apollo-tooling 用于 Apollo 生态。生成的 SDL 是三者的共同输入。如果目标是 mock 服务端,同一份 JSON 样本还能丢给配套的 JSON-to-TypeScript 转换器生成 TypeScript 类型,mock 服务端的返回类型和 GraphQL schema 就出自同一来源。
使用方法
粘贴你的 JSON API 响应
从 REST 或 GraphQL 接口拖入一个 JSON 对象。生成器遍历结构,为每个嵌套对象形态输出对应的 GraphQL schema 类型定义。
选择 schema 风格
在 SDL(Schema Definition Language,标准的 .graphql 格式)和 JSON 表示之间切换。对每个字段都可能缺失的 API,开启「默认可空」。
复制 schema
把 SDL 或 JSON schema 复制到剪贴板。输出可直接粘贴到 Apollo Server、GraphQL Yoga 和 gqlgen —— 无需额外格式化。
常见问题
它如何把 JSON 类型映射到 GraphQL 标量类型?
JSON 字符串映射为 `String`;数字根据样本是否含小数点分别映射为 `Int` 或 `Float`;布尔值映射为 `Boolean`;ISO 8601 日期字符串会被自动识别并映射为自定义的 `DateTime` 标量(在 resolver 映射中自行定义)。
它能处理 GraphQL 列表吗?
可以。JSON 数组在 schema 中表示为 `[Type]`。对象数组变为 `[NestedType]`,标量数组变为 `[String]`、`[Int]` 等。生成器从样本数组的第一个元素推断列表元素类型。
那 GraphQL 的 mutation 和 query 呢?
生成器只输出类型定义 —— 不输出 query、mutation 或 subscription。需要手写 resolver。这些类型是 `graphql-codegen`、`gqlgen` 或你选用的 GraphQL 库的输入。
能为 mutation 生成 input 类型吗?
可以 —— 在输出选项中切换「input 类型」,就会输出 `input` 类型而非 `type` 定义。Input 类型用在 mutation 的参数里,即客户端向服务端发送数据的场景。
它如何判定可空性?
默认情况下,样本数组每个元素都出现的字段为不可空(`String!`),在部分元素中缺失的字段为可空(`String`)。切换「默认可空」让所有字段都可空 —— 这是会演进的 API 更稳妥的选择。
限制说明
- 不支持 union 或 interface 类型生成器只输出 object 类型和 scalar 类型。GraphQL union(用于多态响应)和 interface 类型无法从扁平 JSON 推断 —— 需要在生成后手动补充。
- 不做 enum 识别一个只取 'pending'、'active' 或 'closed' 的字符串字段会被输出为 String,而不是 GraphQL enum。请在生成后人工加 enum。
- 类型推断依赖样本在样本里是字符串的字段,在同一接口的另一份响应中可能是 Int。生成器只根据给定样本推断类型 —— 如果 API 不稳定,请用多份样本测试。
平台说明
- macOS
- 生成的 SDL 可直接粘贴到 Apollo Studio、GraphQL Playground 和任何 GraphQL IDE。在原型阶段从样例 API 响应生成 schema,浏览器工具是合适的选择。
- Windows
- 生成的 SDL 可在 Windows 上的 Altair GraphQL Client 和 GraphiQL 中使用。适合在后端接口尚未文档化时做客户端一次性生成。
- Linux
- 命令行场景可用 `graphql-codegen` 和 `apollo-tooling` 对在线接口做 introspection。当接口尚未部署或位于鉴权层之后时,浏览器工具是合适的选择。
- Web
- 完全在客户端运行。支持离线。适合在 API 设计阶段从静态 JSON fixture 文件生成 schema。