在 Jackson 中使用继承反序列化嵌套对象

问题描述

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

  1. 在长格式方法中,我使用 JsonSubTypes 来使用 type 字段并确定是选择通用节点类类型还是许多叶节点类型之一以进行反序列化。
  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"
        }
      ]
    }
  ]
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)