解析 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);
因此,在我的 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);