跳到主要内容

数据进化:JSON To GraphQL模式 — Numio

根据示例 JSON 生成 GraphQL SDL 对象类型。根节点变为 AutogeneratedMainType,每个嵌套对象或对象数组变为具名类型,数组中的所有元素会合并为一个类型。

根据现有 REST 接口的一个响应,为包装它的 GraphQL 层起草类型。

JSON

GraphQL

适用场景

  • 根据现有 REST 接口的一个响应,为包装它的 GraphQL 层起草类型。
  • 从示例数据得到 mock 服务器或 schema-first 原型的初始 schema。

使用方法

  1. 将 JSON 对象或对象数组(会合并为一个根类型)粘贴到左侧编辑器,或用加载文件按钮打开 UTF-8 文件。
  2. 检查生成的类型:类型名来自键名(posts 变为 Posts),标量映射为 String、Int、Float 或 Boolean。
  3. 复制 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 值不带类型信息。如果该字段是数字或对象,请换成真实的示例值。

规范与参考资料