gpt4 book ai didi

java - 使用 Jackson 将巨大的 JSON 响应反序列化为 POJO 的最有效方法是什么?

转载 作者:行者123 更新时间:2023-12-04 15:40:44 24 4
gpt4 key购买 nike

我有一个 Vert.x/Java 网络服务,该服务对另一个服务进行 REST 调用并接收类似于以下内容的分页响应:

{
"pagination": {
"count": 500,
"totalPages": 279,
"totalResources": 139255,
"next": "https://some-service.com/some-endpoint?next=(some-hash)"
},
"objects": [
{
// About 200 fields per "object" mixed in various levels of nesting,
// only about 10 of which I want to deserialize
"model": {
"A field": "A value"
},
"topLevelField": "value",
"someMoreNestedData": {
// ...
}
}
]
}

500 个“对象”的最大响应大小约为 4-5MB,或大约 10 万行文本。收到响应后,我想使用 Jackson 将对象数组反序列化为一个扁平化数据模型,该模型由我的系统关心的每个对象的 10 个字段组成,丢弃其余部分。我还需要在'pagination'节点记录分页信息。

我已经使用两个与这些非常相似的类实现了反序列化(为了节省空间省略了 Lombok 注释):

@JsonIgnoreProperties(ignoreUnknown = true)
public class RawResponse {
@JsonIgnore
private Integer count;
@JsonIgnore
private Integer totalPages;
@JsonIgnore
private Integer totalResources;
@JsonIgnore
private String next;
@JsonProperty("objects")
private List<MyCustomObject> products;

@JsonSetter("pagination")
public void deserializePaginationNode(Map<String,Object> paginationNode) {
if (MapUtils.isEmpty(paginationNode)) {
log.error("Failed to deserialize pagination node: {}", Arrays.toString(paginationNode.entrySet().toArray()));
return;
}

this.count = (Integer) paginationNode.get("count");
this.totalPages = (Integer) paginationNode.get("totalPages");
this.totalResources = (Integer) paginationNode.get("totalResources");
this.next = (String) paginationNode.get("next");
}

MyCustomObject 中,我使用 @JsonIgnore 注释和 @JsonSetter("node name") 来强制 Jackson 使用我的方法反序列化:

@JsonIgnoreProperties(ignoreUnknown = true)
public class MyCustomObject {
@JsonIgnore
private List<String> someField;
@JsonIgnore
private String anotherField;

// ...

@JsonSetter("model")
public void deserializeModelNode(Map<String,Object> modelNode) {
if (MapUtils.isEmpty(modelOfferingNode)) {
log.error("Failed to deserialize model node: {}", Arrays.toString(modelOfferingNode.entrySet().toArray()));
return;
}

this.field = (List<String>) modelNode.get("field");
this.anotherField = (String) modelOfferingNode.get("anotherField");
}

这种方法可行,但我很好奇是否有更有效的实现可以实现相同的结果,即使用 Jackson 将不同嵌套级别的约 200 个字段的复杂数据结构展平为平面结构。例如,我知道您可以使用 @JsonDeserialize 并编写一个较低级别的反序列化器,该反序列化器可以处理更原始的数据类型,例如 JsonNode 等。有没有人知道一个好的替代方案?

最佳答案

Parsing Large JSON Files using Jackson Streaming API Example

Jackson's Streaming API. Jackson is one of the most popular JSON processing framework and provides three main model to parse and process JSON data including Streaming API, data binding and tree model. Out of these three, Streaming works at lowest level and can be used to parse huge JSON response upto even giga bytes of size

关于java - 使用 Jackson 将巨大的 JSON 响应反序列化为 POJO 的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57930828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com