我尝试了一些变体,但没有运气返回GraphQL中的地图。因此,我有以下两个对象:
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神奇地处理这一点或另一种方法。
非常感谢!
以防万一—您可以始终将映射对象表示为JSON字符串(在我的示例中,这很有用)。
public class Person {
private String type;
private Map<String, Customer> customers;
// getters & setters
}
会是
type Person {
type: String!
customers: String!
}
在此之后,不要忘记添加数据获取程序,将其转换为JSON。
public DataFetcher<String> fetchCustomers() {
return environment -> {
Person person = environment.getSource();
try {
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.writeValueAsString(person.getCustomers());
} catch (JsonProcessingException e) {
log.error("There was a problem fetching the person!");
throw new RuntimeException(e);
}
};
}
它将返回:
"person": {
"type": "2",
"customers": "{\"VIP\":{\"name\":\"John\",\"age\":\"19\"},\"Platinum VIP\":{\"name\":\"Peter\",\"age\":\"65\"}}"
}
之后,您可以像处理客户机中的典型JSON字符串一样处理客户。
GraphQL(GitHub上的讨论)中没有地图类型。
另一种方法是将客户
作为客户
的列表
public class Person {
private String type;
private List<Customer> customers;
}
并将地图的键包含在Customer
类中
public class Customer {
private String key; // or another meaningful name
private String name, age;
}
模式基本上保持不变。
type Customer {
key: String! // or another meaningful name
name: String!
age: String!
}
type Person {
type: String!
customers: [Customer!]!
}
正如您自己所指出的,GraphQL中没有映射类型,主要是因为映射基本上是未类型的数据(或具有动态结构的数据),因此,不能很好地转换为GraphQL期望的静态类型。尽管如此,你还是有几个选择。
1)您可以更改值类型,使其包含键,并在映射中放弃,使用列表代替。这是你在自己的答案中采取的方法。我不会在这里详细说明,因为你已经举例说明了。
2) 只要键和值Java类型已知(而不是例如对象
),就可以将映射视为键-值对列表。您可以创建一个类型来表示该对:
type Person {
type: String!
customers: [CustomerEntry!]
}
type CustomerEntry {
key: String!
value: Customer!
}
在不利的一面,你现在有更丑陋的查询:
{
person {
type
customers {
key
value {
name
}
}
}
}
另一方面,您保持了类型安全性和(主要)语义。可以继续嵌套这种方法,例如表示映射
3) 如果您有一个完全未知的类型,即
对象
,那么唯一的选择就是将其视为复杂标量。在JavaScript中,这种方法被称为JSON标量,因为它归结为在其中填充任意JSON结构并将其视为标量。同样的方法也可以在Java中实现。GraphQLJava现在有一个扩展标量的项目。下面是他们的ObjectScalar(别名为JsonScalar)实现。
现在,如果您想表示一个类型,例如
Map
事实上,您可以决定将任何映射(实际上是任何类型,但这并不有用)表示为JSON标量。
type MapEntry {
key: String!
value: [ObjectScalar!]
}
scalar ObjectScalar
从正面来看,现在可以精确地保持任何动态结构的形状。另一方面,由于它是一个标量,因此不可能进行子选择,并且您无法在事先不知道内部内容的情况下获取所有子选择。
问题内容: 如何从作为Tkinter回调执行的函数中获取返回的对象? 显然,这是一个简化的示例。实际上,按钮调用的函数将返回对象,我希望将这些对象附加到将保留在主Python名称空间中的对象列表中,以进行进一步的操作。 无论如何,在这里用户可以使用GUI选择该函数的自变量,然后按下将执行该函数的按钮。但是,该函数的返回值似乎注定会丢失给以太,因为回调函数将不接受返回值。在不使用丑陋的定义的情况下可
问题内容: 这是一个非常基本的请求-响应测试。浏览器使用jQuery $ .ajax API将“来自浏览器的hello”发送到servlet,然后servlet接收此消息,然后使用org.json.simple库创建一个JSON对象,并将带有消息“ hello from server”的JSON响应发送回浏览器。 我在本地主机上运行它,只是假设我的IP地址是123.123.12.123,平台是Ub
问题内容: 我试图做这样的事情: 我认为味精将被设置为my_script.php返回的文本,即jqXHR对象的responseText。由于msg始终设置为“ [object XMLHttpRequest]”,因此显然无法正常工作 有一种快速的1行方法可以做我想要的吗? 谢谢。 问题答案: 经过一些测试,我最终找到了解决方案。 我需要同步调用,$ .get速记函数始终是异步的,因此我将需要使用$
问题内容: 我想使用这样的Promise来调用Google Maps Geocoding API: 当我调用函数请求时,我发现我得到了一个Promise而不是一个值: 为什么不答应。然后在返回值之前执行?我如何从这个承诺而不是另一个承诺中获得价值? 问题答案: 如果您依赖承诺来返回数据,则必须从函数中返回承诺。 一旦调用堆栈中的1个函数异步,那么要继续线性执行,所有要调用它的函数也必须异步。(异步
问题内容: 问题答案: 有很多原因不回来。 但这通常归结为以下事实:执行的命令不会退出。 同样,这可能有很多原因。 一个普遍的原因是该过程产生了一些输出,而你没有从适当的流中读取。这意味着一旦缓冲区已满,进程就会被阻塞,并等待你的进程继续读取。你的进程依次等待另一个进程完成(之所以不会,是因为它等待你的进程,…)。这是一个典型的僵局情况。 你需要不断从流程输入流中读取内容,以确保它不会被阻塞。
问题内容: 我如何获得一个线程以将元组或我选择的任何值返回给Python中的父级? 问题答案: 我建议您在启动线程之前实例化Queue.Queue,并将其作为线程的args之一传递:在线程完成之前,它将结果作为参数接收到的队列中。父母可以或愿意。 队列通常是在Python中安排线程同步和通信的最佳方法:队列本质上是线程安全的消息传递工具,这是组织多任务的最佳方法!