【发布时间】:2020-10-19 17:13:37
【问题描述】:
我正在尝试为用户定义的 GraphQL 查询的响应编写反序列化代码。该代码可以访问 JSON 序列化形式的查询响应和底层 GraphQL 架构(通过查询端点的 schema.json 或发出自省请求)。
假设以下架构:
scalar Date
type User {
name: String
birthday: Date
}
type Query {
allUsers: [User]
}
schema {
query: Query
}
还有以下查询:
query {
allUsers {
name
birthday
}
}
响应可能如下所示(为简洁起见,仅包括完整响应中的data.allUsers-字段):
[
{"name": "John Doe", "birthday": "1983-12-07"}
]
我正在尝试以保留类型信息的方式反序列化上述响应,包括任何自定义标量。在上面的示例中,我按照惯例知道 GraphQL 标量 Date 在 Java 中应该反序列化为 LocalDate,但仅从响应中我不知道 birthday 字段代表 GraphQL 标量类型 Date ,因为它在 JSON 中被序列化为常规字符串。
我可以做的是尝试为此使用 GraphQL 模式。对于上面的示例,架构可能看起来像这样(为了简洁而缩短):
...
"types": [
{
"kind": "OBJECT",
"name": "User",
"fields": [
{
"name": "name",
"type": {
"kind": "SCALAR",
"name": "String"
}
},
{
"name": "birthday"
"type": {
"kind": "SCALAR",
"name": "Date"
}
}
...
根据这些信息,我可以推断出该响应的birthday 字段的类型为Date,并相应地对其进行反序列化。但是,如果查询使用非平凡的 GraphQL 功能,事情就会变得更加复杂。以别名为例:
query {
allUsers {
name
dayOfBirth: birthday
}
}
此时我已经需要跟踪任何别名(我可以这样做,因为如果我解析查询,该信息是可用的),并回溯那些以找到正确的类型。我担心如果例如,它可能会变得更加复杂。使用片段。
鉴于我使用graphql-java,并且它似乎已经需要处理所有这些情况以进行序列化,我想知道是否有比手动回溯类型更简单的方法来做到这一点来自查询和架构。
【问题讨论】:
标签: java graphql json-deserialization graphql-java