我有一个数据 JSON 对象,它有几个动态字段,因此我无法在 Graphql 中定义架构,而是使用标量将其定义为 Json。我的要求是使用数据 json 对象过滤字段。下面显示了一个示例用例
query.graphqls
scalar Locale
scalar JSON
type Query {
details: Details!
}
type Details {
locale: Locale!
name: String!
data: JSON!
}
详细信息.java
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Details {
private Locale locale;
private String name;
private List<?> data;
}
ScalarTypeConfig.java
@Configuration
public class ScalarTypeConfig {
@Bean
public GraphQLScalarType locale() {
return ExtendedScalars.Locale;
}
@Bean
public GraphQLScalarType json() {
return ExtendedScalars.Json;
}
}
SampleController.java
@Component
public class SampleController implements GraphQLQueryResolver {
public Details getDetails() {
Details details = new Details();
details.setLocale(Locale.ENGLISH);
details.setName("Manu");
List<Map<String, Integer>> allContents = new ArrayList<>();
Map<String, Integer> contents = new HashMap<>();
contents.put("amount", 112);
contents.put("totalPrice", 333);
allContents.add(contents);
contents = new HashMap<>();
contents.put("amount", 222);
contents.put("totalPrice", 444);
allContents.add(contents);
details.setData(allContents);
return details;
}
}
现在,当我传递以下查询时,我会得到输出
{
details {
name
locale
data
}
}
输出
{
"data": {
"details": {
"name": "Manu",
"locale": "en",
"data": [
{
"amount": 112,
"totalPrice": 333
},
{
"amount": 222,
"totalPrice": 444
}
]
}
}
}
所需用例
但我的要求是动态仅从数据对象中获取指定的字段。例如
{
details {
name
locale
data {
amount
}
}
应返回如下所示的结果,仅包含金额
详细信息,而不显示totalPrice
预期输出
{
"data": {
"details": {
"name": "Manu",
"locale": "en",
"data": [
{
"amount": 112
},
{
"amount": 222
}
]
}
}
}
有人可以告诉我是否有办法做到这一点。 graphQL是否支持这种用例
最佳答案
不可能使用标量 json 并期望 graphql 解释它的任何内容。
但是,您可以使用巧妙的方法,通过其他方式定义数据中所需的字段:
{
details (dataFields: {
amount: true
}) {
name
locale
data
}
}
您应该定义一个 dataFields
参数,类型可以是简单的 JSON,然后用 Java 解析它并包含或不包含基于该 json 的字段。
无论如何,都不可能有 GraphQL 可以解析的 JSON。
如果可能的话,您应该考虑为该数据创建正确的类型,而不是原始 JSON。
关于json - 在 GraphQL 中过滤无模式 json 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71637187/