数据进化:JSON To GraphQL模式 — Numio
根据示例 JSON 生成 GraphQL SDL 对象类型。根节点变为 AutogeneratedMainType,每个嵌套对象或对象数组变为具名类型,数组中的所有元素会合并为一个类型。
根据现有 REST 接口的一个响应,为包装它的 GraphQL 层起草类型。
JSON
GraphQL
适用场景
- 根据现有 REST 接口的一个响应,为包装它的 GraphQL 层起草类型。
- 从示例数据得到 mock 服务器或 schema-first 原型的初始 schema。
使用方法
- 将 JSON 对象或对象数组(会合并为一个根类型)粘贴到左侧编辑器,或用加载文件按钮打开 UTF-8 文件。
- 检查生成的类型:类型名来自键名(posts 变为 Posts),标量映射为 String、Int、Float 或 Boolean。
- 复制 SDL,然后为必填字段加上 !,把 id 字段改为 ID,并重命名 AutogeneratedMainType。
JSON 对象
{
"id": "u_1",
"name": "Ada",
"age": 36,
"score": 9.5,
"nickname": null,
"tags": ["math"],
"address": { "city": "London" },
"posts": [{ "id": 7, "title": "Notes" }]
}GraphQL schema(SDL)
type AutogeneratedMainType {
id: String
name: String
age: Int
score: Float
nickname: String
tags: [String]
address: Address
posts: [Posts]
}
type Address {
city: String
}
type Posts {
id: Int
title: String
}功能与限制
字段会在所有数组元素间合并。null 和空数组变为 String 和 [String];Int 与 Float 混合变为 Float,其他冲突回退为 String。
类型名来自键名(posts 变为 Posts)。如果同一个键对应结构不同的对象,后出现的会以父级命名(例如 AB),而不会覆盖前者。
不会生成 !(非空)、ID、Query 类型或 input 类型。超出 32 位范围的整数会定为 Float,因为 GraphQL 的 Int 是 32 位。
在浏览器中运行,结果用 Prettier 格式化;无效 JSON 会显示解析错误。
FAQ
根节点可以是 JSON 数组吗?
如果数组元素是对象就可以:所有元素会合并到 AutogeneratedMainType,只在部分元素中出现的字段也会包含在内。由普通值组成的根数组没有字段,会被拒绝。
为什么 id 字段是 String 而不是 ID?
类型只根据 JSON 值决定:字符串 id 变为 String,数字变为 Int。请手动改为 ID:。
null 值是什么类型?
String,因为 null 值不带类型信息。如果该字段是数字或对象,请换成真实的示例值。