json GraphQL可以处理XML响应,其中单个项目数组转换为字典吗?

euoag5mw  于 2023-10-21  发布在  其他
关注(0)|答案(2)|浏览(101)

我目前正在使用GraphQL/Node/Express服务器,它可以从另一个API中检索数据。除了我收到的数据之外,我绝对不能访问其他API。
我的问题是,响应是XML,并且有某些字段应该作为数组返回,但如果数组中只有一个项,则会作为对象(或字典)返回。
This blog post更详细地解释了这个问题。
GraphQL中是否有一种方法可以设计模式,如果它接收到一个定义为数组的属性的对象,它会将该对象放入数组中?

示例

  • 当前行为 *
<team>
  <employee>
    <name>Joe</name>
    <surname>Bloggs</surname>
  </employee>
  <employee>
    <name>Jane</name>
    <surname>Doe</surname>
  </employee>
</team>

上面的XML将转换为JSON如下

{
  team:{
    employee:[
      {
        name:'Joe',
        surname:'Bloggs'
      },
      {
        name:'Jane',
        surname:'Doe'
      }
    ]
  }
}

但如果只有一个员工

<team>
  <employee>
    <name>Joe</name>
    <surname>Bloggs</surname>
  </employee>
</team>

上面的XML将转换为JSON,如下所示,其中employee成为对象而不是数组

{
  team:{
    employee:{
      name:'Joe',
      surname:'Bloggs'
    }
  }
}
6bc51xsx

6bc51xsx1#

是的,可以实现,也很容易实现

使用Apollo,您可以定义解析器Map,用于解析类型的所有字段和子字段,以进行查询和变更。
Read about resolvers
在本例中,您可以为Team类型上的特定字段employee编写一个解析器,这将确保返回一个数组。

{ 
  Team: {
   employee(parentObject, args, context) {
     const {employee} = parentObject
         // you should probably handle the case when employee is null or undefined
     return Array.isArray(employee) ? employee : [employee]
   }
  ...
}

结果将是:

{
  team: {
    employee: [
      {
        name:'Joe',
        surname:'Bloggs'
      }
    ]
  }
}

注意:你不必自己实现所有的解析器函数。如果您没有为字段提供解析器函数,Apollo将使用默认的解析器。这通常意味着简单地按原样返回值。

weylhg0b

weylhg0b2#

当你调用那个API时,你可以使用“force_list=('employee',),假设你知道哪些字段会抛出这个问题。这将确保它总是被转换为列表,即使一个对象存在。

相关问题