gpt4 book ai didi

java - 从 GraphQL-Java 返回 HashMap

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:46 25 4
gpt4 key购买 nike

我尝试了几个变体,但没有运气在 GraphQL 中返回 map 。所以我有以下两个对象:

public class Customer {

private String name, age;
// getters & setters
}

public class Person {

private String type;
private Map<String, Customer> customers;
// getters & setters
}

我的架构如下所示:

type Customer {
name: String!
age: String!
}

type Person {
type: String!
customers: [Customer!] // Here I tried all combination but had no luck, is there a Map type support for GQL?
}

有人可以告诉我如何实现这一点,以便 GraphQL 神奇地处理这个或替代方法。

非常感谢!

最佳答案

正如您自己指出的,GraphQL 中没有 map 类型,主要是因为 map 是具有动态结构的数据,因此不能很好地转换为 GraphQL 期望的静态类型。不过,您还有一些选择。

  1. 您可以更改值类型以使其包含键,然后放弃 map 并改用列表。这是您在自己的回答中采用的方法。我不会在这里详细介绍,因为您已经举例说明了。

  2. 只要知道键和值的 Java 类型(而不是例如 Object ),您就可以将映射视为键值对列表。您可以创建一个类型来表示该对:

    类型人 {类型:字符串!客户:[CustomerEntry!]

    键入 CustomerEntry {关键:字符串!值(value):客户!

不利的一面是,您现在有更丑陋的查询:

{
person {
type
customers {
key
value {
name
}
}
}
}

从好的方面来说,您可以保持类型安全和(主要)语义。可以继续将这种方法嵌套到例如代表一个Map<String, Map<Long, Customer>> .

  1. 如果您有一个完全未知的类型,即 Object ,唯一的选择是将其视为复数标量。在 JavaScript 中,这种方法称为 JSON scalar因为它归结为填充任意 JSON 结构并将其视为标量。可以在 Java 中实现相同的方法。 graphql-java 现在有一个项目 extended scalars .这是他们的 ObjectScalar (别名为 JsonScalar )实现。

现在,如果你想表示一个类型,例如 Map<String, Object> ,您可以选择使用上面的键值对方法来表示它,只有值类型是 JSON 标量,或者您可以将整个 map 表示为 JSON 标量。

事实上,您可以决定将任何 映射(好吧,实际上是任何类型,但这没有用)表示为 JSON 标量。

type MapEntry {
key: String!
value: [ObjectScalar!]
}

scalar ObjectScalar

从好的方面来说,您现在可以准确地保持任何动态结构的形状。不利的一面是,由于它是一个标量,因此无法进行子选择,并且您无法提前获取所有内容,而不知道里面有什么。

关于java - 从 GraphQL-Java 返回 HashMap<String, Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47674558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com