jackson - 在杰克逊中使用继承反序列化嵌套对象
问题描述
我正在比较嵌套对象是多态的反序列化嵌套 JSON 结构的速度。在这个树结构中,我认为每个非叶节点都是通用节点类型,而叶节点可以是通用节点类型的许多派生类型之一。我有两种形式的 JSON - 紧凑型和长型。
- 在长格式方法中,我使用 JsonSubTypes 来使用类型字段并确定是选择通用节点类类型还是要反序列化的许多叶节点类型之一。
- 在紧凑的形式中,我使用了一个自定义类反序列化器。我寻找诸如足球或足球之类的键以确定它们是叶节点还是通用节点。由于节点的名称不是同一个字典的一部分,而是它的键,我需要将它传递给子节点,以便子节点可以创建自己。代码片段如下所示。
虽然都正确反序列化,但为什么 2) 比 1) 慢。数据集类型 2 大约需要 4 秒,而类型 1 需要 1.5 秒。
- 是因为我每次都在读取树的值(从当前节点一直到叶节点)
readValueAsTree
吗? - 是否有更简单的方法将 fieldValue 反序列化到其对象类中,而不是在其上调用 treeToValue,因为我相信 treeToValue 触发了
TurfSport.class
创建另一个jsonParser
和后续触发器的自定义类反序列化器readValueAsTree
?
感谢您的时间!
JsonNode node = jsonParser.readValueAsTree();
final ObjectMapper mapper = (ObjectMapper) jsonParser.getCodec();
List<Node> children = new ArrayList<>();
while(iterate through fields in node.fields() {
if(field has type key set to turf in it) {
children.add(mapper.treeToValue(fieldValue, TurfSport.class));
}
else if (field has type key set to water in it) {
children.add(mapper.treeToValue(fieldValue, WaterSport.class));
}
else
children.add(mapper.treeToValue(fieldValue, Generic.class));
}
return Generic Node Object
袖珍的:
{
"parent": {
"child1": {
"football": "varsity",
"type": "turf"
},
"child2": {
"swimming": "league"
"type": "water"
}
}
}
长表:
{
"type": "generic",
"name": "parent",
"children": [
{
"type": "generic",
"name": "child1",
"children": [
{
"type": "turf",
"name": "football",
"contest": "varsity"
}
]
},
{
"type": "generic",
"name": "child2",
"children": [
{
"type": "water",
"name": "swimming",
"contest": "league"
}
]
}
]
}
解决方案
推荐阅读
- ios - Xcode 11 UINavigationController 栏问题
- mysql - Laravel 查询导致复杂的连接场景
- yocto - 元工具链目标构建
- javascript - 如何使用正则表达式对数组中的 Javascript 对象进行排序
- python - 如何修复:“除了连接轴之外的所有输入数组维度必须完全匹配”python
- python - 使用列表创建字典
- ruby-on-rails - 除非在新选项卡上加载链接,否则 Ruby send_file 不起作用
- java - Spring Boot:使用 http.server.requests 的 API 统计
- react-native - 原生模块不能为空 - react-native-purchase
- pascal - 集合中是否允许使用负整数?