解析 Java 字符串 JSON 以仅保留相关字段

Parse Java String of JSON to keep only relevant fields

因此,在我的 Java 应用程序中,我调用了一个 API 并且它 returns 数据 作为字符串 这种格式:

String1 =

{
   "data":{
        "metadata":{
             // something
        }
        "node":{
              "edges":[
                   {//edge 1},
                   {//edge 2},
                   ...
              ]
        }
   }
}

现在由于分页数据,我不得不多次调用 API。因此,我有 String1, String2, ..., StringN.

现在我想生成一个 StringComposite,它应该忽略其他字段并将所有 edges json 对象组合到一个列表中,如下所示:

{
   "edges":[
      {//edge 1},
      {//edge 2},
      {//edge 3},
      {//edge 4},
      ...   
   ]
}

我怎样才能做到这一点?

一种可能的解决方案:

  • 像这样创建一个 POJO 来解析来自 API 的单个响应,忽略不需要的属性:

例如,使用 Lombok @Data 和 Jackson @JsonIgnoreProperties 注释

@Data
public class Root {
    private Data data;
}

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Data {
    // metadata field is skipped
    private List<Edge> edges;
}
  • 结果StringComposite可以这样定义:
@Data
@AllArgsConstructor
public class StringComposite {
    private List<Edges> edges;
}
  • 因此,输入字符串被解析为 list/stream Root POJO,然后使用 Stream::flatMap:
  • 将其合并为单个 StringComposite
ObjectMapper om = new ObjectMapper();

List<String> apiResponses = ...; // build list of API responses

List<Edge> mergedEdges = apiResponses
    .stream()
    .map(str -> try { 
            return om.readValue(str, Root.class); 
        } catch (JsonParseException | JsonMappingException jex) {
            throw new IllegalArgumentException(jex);
        }) // Stream<Root>
    .flatMap(root -> root.getEdges().stream()) // Stream<Edge>
    .collect(Collectors.toList()); // List<Edge>

StringComposite result = new StringComposite(mergedEdges);