繁体   English   中英

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

[英]Parse Java String of JSON to keep only relevant fields

因此,在我的 Java 应用程序中,我调用了 API,它以以下格式将数据作为字符串返回:

String1 1 =

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

现在由于分页数据,我不得不多次调用 API。 因此,我有String1String2 ,..., 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;
}
  • 因此,输入字符串被解析为列表/流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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM