json - 在 GraphQL 中过滤无模式 json 对象

标签 json spring java-8 graphql graphql-schema

我有一个数据 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/

相关文章:

java - 我无法使用 Gson 将 Json 文件解析为 java 对象

javascript - 如何在不刷新页面的情况下定时更新数据?

html - 尝试使用程序点击网页上的 1,000 个 span。这可能吗?

java - 如何分组然后使用java8流列出toMap

java - 使用 Java 流将 List<int[]> 更改为 Map<int[],int[]>

java - Clojure 转换器与 Java 中流的中间操作的概念相同吗?

php - value 文件 uploader : size value for onComplete, 列表项 Hook 和文件覆盖选项

iphone - JSON 数据中的 UITableView 部分

java - Spring ResourceHandler 模式对于索引页失败

java - 如何通过基于 Java 的配置在 Hibernate 中的查询上使用分页