【发布时间】:2015-02-12 01:30:58
【问题描述】:
我有一个特定类的反序列化器,它在读取字段时需要一些排序。
假设我的班级有两个字段(field1 和 field2),为了阅读 field2,首先需要 field1。
例如,对于以下 json 数据,它可以工作,因为当反序列化器解析 field2 时,field1 已经设置:
{"field1": 3, "field2": 4}
但是,如果我们反转字段:
{"field2": 4, "field1": 3}
我需要通过jp.skipChildren 跳过field2,因为field1 未设置。当field1被解析时,Jackson应该重新读取并解析field2。
一种选择是解析 field2 而不是跳过并将其保存在一个变量中,以便在设置 field1 时,它可以使用保存 field2 中数据的变量。然而;基于field1 的值,我可能不需要解析field2,因此我正在寻找更好的解决方案,因为性能在这部分代码中至关重要。
我正在使用Mapper.readValue(byte[], MyClass.class) 方法,似乎杰克逊使用ReaderBasedJsonParser 进行解析。即使可以获得令牌位置,我也找不到设置令牌位置的方法。
【问题讨论】:
-
您有一个问题,即您依赖 RFC for JSON (RFC 7159) 所说的对象成员顺序无关紧要。你为什么要订单?为什么不尝试反序列化两者?
-
@fge 因为特定字段有关于我应该如何解析其他字段的信息。将 JSON 树解析为通用 JsonNode 始终是一种选择,但它会带来开销,所以我想避免它。
-
@fge,既然您了解 Avro,我想做的就是将 JSON 解析为 Avro 模型。 JSON 中的一些字段包含有关 Avro 模式的信息,因此为了解析树,首先我需要知道这些值。您可以从这里查看代码:github.com/buremba/rakam/blob/…
标签: java json jackson deserialization jackson-modules