首页 > 解决方案 > 在杰克逊中使用继承反序列化嵌套对象

问题描述

我正在比较嵌套对象是多态的反序列化嵌套 JSON 结构的速度。在这个树结构中,我认为每个非叶节点都是通用节点类型,而叶节点可以是通用节点类型的许多派生类型之一。我有两种形式的 JSON - 紧凑型和长型。

  1. 在长格式方法中,我使用 JsonSubTypes 来使用类型字段并确定是选择通用节点类类型还是要反序列化的许多叶节点类型之一。
  2. 在紧凑的形式中,我使用了一个自定义类反序列化器。我寻找诸如足球或足球之类的键以确定它们是叶节点还是通用节点。由于节点的名称不是同一个字典的一部分,而是它的键,我需要将它传递给子节点,以便子节点可以创建自己。代码片段如下所示。

虽然都正确反序列化,但为什么 2) 比 1) 慢。数据集类型 2 大约需要 4 秒,而类型 1 需要 1.5 秒。

  1. 是因为我每次都在读取树的值(从当前节点一直到叶节点)readValueAsTree吗?
  2. 是否有更简单的方法将 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"
        }
      ]
    }
  ]
}

标签: jacksonjackson-databindjackson-modules

解决方案


推荐阅读