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

在GraphQL中如何表示并查询带动态键的键值对映射对象?

方案1:转为数组结构(推荐,符合GraphQL最佳实践)

GraphQL的强类型系统默认不支持动态未知的字段名,这种方案可以保留完整的类型校验能力,是官方推荐的处理动态键的方式。你只需要在resolver层预处理返回的result对象,把动态键作为每个子项的属性,整合成数组返回即可。

类型定义与处理代码示例:

// 定义单个条目的类型,新增key字段存储原来的动态键
const ResultItemType = new GraphQLObjectType({
  name: 'ResultItemType',
  fields: () => ({
    key: { type: GraphQLString },
    id: { type: GraphQLString }
  })
})

// 父级类型中把result定义为上述类型的数组
const RootQueryType = new GraphQLObjectType({
  name: 'RootQueryType',
  fields: () => ({
    result: { 
      type: GraphQLList(ResultItemType),
      resolve: (parent) => {
        // 把原有的动态键对象转为数组
        const rawResult = parent.result
        return Object.entries(rawResult).map(([key, value]) => ({
          key,
          ...value
        }))
      }
    }
  })
})

客户端查询示例:

query {
  result {
    key
    id
  }
}
方案2:使用JSON标量(适合需要保留原对象结构的场景)

如果你必须保持原有的嵌套对象结构不做转换,可以使用自定义的JSON标量类型直接返回整个result对象,放弃对result内部结构的类型校验。

你可以引入graphql-type-json包中的GraphQLJSONObject类型实现,类型定义示例:

const { GraphQLJSONObject } = require('graphql-type-json')

const RootQueryType = new GraphQLObjectType({
  name: 'RootQueryType',
  fields: () => ({
    result: { type: GraphQLJSONObject }
  })
})

这种方案客户端可以拿到和需求结构完全一致的对象,自行处理动态键的遍历逻辑,但GraphQL不会对result内部的字段做类型校验,也无法实现对内部字段的按需查询。

内容的提问来源于stack exchange,提问作者Mike K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:24:01