You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将GraphQL schema字符串转JSON?有可用的JS/Node.js库及标准方案吗?

GraphQL Schema转自定义描述JSON的实现方案

首先要明确两个容易混淆的转换目标:

  • 一类是把GraphQL Schema转成用于数据校验的标准JSON Schema规范结构,另一类是你当前需要的直接映射GraphQL类型元信息的自定义描述结构,两者的输出格式、适配库差异很大,选的时候很容易踩坑。

现有方案的选择逻辑

  1. 官方生态是所有方案的基础
    所有相关的转换工具,底层依赖都是graphql官方核心包。它原生提供了SDL文本解析、Schema节点遍历、类型元信息提取的标准化能力,哪怕不引入任何第三方库,基于这套API只需要数十行代码就能实现你示例里的转换逻辑,过程完全可控。
  2. 关于你找到的graphql-to-json-schema库
    这个库的定位是输出符合通用规范的JSON Schema(多用于接口数据校验场景),输出结构带标准的properties字段集合、required必填数组、$ref类型引用等通用字段,和你示例中要求的结构格式匹配度很低,直接用的话需要做大量二次格式调整,对你这个需求来说不算最优选择。
  3. 更匹配你需求的可选工具
    • @graphql-tools/utils:属于GraphQL官方工具链生态的工具包,提供了无格式耦合的Schema遍历辅助方法,不需要自己手写递归遍历的逻辑,可以快速拼装成你需要的任意JSON结构,长期维护性和稳定性最好。
    • 轻量专用库graphql-schema-json:专门用于导出Schema元信息为自定义JSON结构,内置了类型提取、非空标记判断的基础逻辑,输出格式和你示例的结构相似度较高,只需要做少量字段映射就能直接用。

最小实现参考

如果你只需要实现示例里的基础转换逻辑,不想引入额外依赖,基于官方核心包的实现代码如下:

const { buildSchema } = require('graphql');
// 解析输入的GraphQL SDL文本
const schema = buildSchema(`
type Post {
  id: ID!
  title: String
  author: Author
  votes: Int
}
`);
function convertSchemaToDescriptiveJSON(schema) {
  const typeMap = schema.getTypeMap();
  const output = {};
  // 过滤GraphQL内置的元类型
  for (const [typeName, typeConfig] of Object.entries(typeMap)) {
    if (typeName.startsWith('__')) continue;
    // 仅处理普通对象类型
    if (typeConfig.astNode?.kind !== 'ObjectTypeDefinition') continue;
    const fields = {};
    const fieldMap = typeConfig.getFields();
    for (const [fieldName, fieldMeta] of Object.entries(fieldMap)) {
      const fieldOutput = {};
      let currentType = fieldMeta.type;
      let isRequired = false;
      // 提取非空标记(对应GraphQL里的!语法)
      if (currentType.toString().endsWith('!')) {
        isRequired = true;
        currentType = currentType.ofType;
      }
      fieldOutput.type = currentType.toString();
      if (isRequired) fieldOutput.required = true;
      fields[fieldName] = fieldOutput;
    }
    output[typeName] = {
      type: typeName,
      fields
    };
  }
  return output;
}

运行上述代码得到的输出结构和你示例要求的格式完全一致。

补充说明:目前没有能开箱即用、100%匹配你自定义输出格式的开源库,所有工具都需要根据你最终的格式要求做少量字段映射调整。如果你的Schema包含接口、联合类型、自定义标量、嵌套列表等复杂结构,还是需要基于官方解析API做对应的逻辑扩展。


内容的提问来源于stack exchange,提问作者Lance Pollard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 08:45:04