当前位置: 首页 > 知识库问答 >
问题:

从GraphQL Java返回HashMap

林波鸿
2023-03-14

我尝试了一些变体,但没有运气返回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神奇地处理这一点或另一种方法。

非常感谢!

共有3个答案

云默
2023-03-14

以防万一—您可以始终将映射对象表示为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字符串一样处理客户。

田曜瑞
2023-03-14

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!]!
}
胡高寒
2023-03-14

正如您自己所指出的,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中安排线程同步和通信的最佳方法:队列本质上是线程安全的消息传递工具,这是组织多任务的最佳方法!