如何将GraphQL schema字符串转JSON?有可用的JS/Node.js库及标准方案吗?
GraphQL Schema转自定义描述JSON的实现方案
首先要明确两个容易混淆的转换目标:
- 一类是把GraphQL Schema转成用于数据校验的标准JSON Schema规范结构,另一类是你当前需要的直接映射GraphQL类型元信息的自定义描述结构,两者的输出格式、适配库差异很大,选的时候很容易踩坑。
现有方案的选择逻辑
- 官方生态是所有方案的基础
所有相关的转换工具,底层依赖都是graphql官方核心包。它原生提供了SDL文本解析、Schema节点遍历、类型元信息提取的标准化能力,哪怕不引入任何第三方库,基于这套API只需要数十行代码就能实现你示例里的转换逻辑,过程完全可控。 - 关于你找到的
graphql-to-json-schema库
这个库的定位是输出符合通用规范的JSON Schema(多用于接口数据校验场景),输出结构带标准的properties字段集合、required必填数组、$ref类型引用等通用字段,和你示例中要求的结构格式匹配度很低,直接用的话需要做大量二次格式调整,对你这个需求来说不算最优选择。 - 更匹配你需求的可选工具
@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
相关产品推荐
相关产品推荐

