【问题标题】:Access deserialized object from custom deserializer从自定义反序列化程序访问反序列化对象
【发布时间】:2015-11-22 13:29:44
【问题描述】:

我的模型中的所有类都是公共基类 Node 的子类。 使用 Jackson 进行序列化/反序列化时,我希望对其他对象的引用替换为它们的 ID。问题是,ID 是两个值的组合:实例本身的 ID 和源的 ID。我使用自定义序列化器和反序列化器来做到这一点。

序列化没问题。我用这样的结构编写 JSON:

{"id":1,"source":2,"name":"Some record","reference":3}

但是在反序列化时,我需要知道源的 ID 和引用节点的 ID,以便能够在我的自定义反序列化器中查找它。

是否可以访问反序列化实例的值,在反序列化引用时访问源的 ID?

这是我目前尝试过的:

public class MyDeserializer extends JsonDeserializer<Node>
{
  @Override
  public NodeData deserialize(...)
  {
    Node parent = (Node)parser.getCurrentValue();
    Long id = parent.getId();
    Long id = parser.getLongValue();
    return NodeDataService.INSTANCE.get(source, id);
  }
}

但是 parser.getCurrentValue() 总是返回 null。

到目前为止,我最好的解决方案是编写一对合作的反序列化器。 第一个注释到属性源和存储的getter 作为每个调用属性的值。第二个看起来像这样:

public class MyDeserializer extends JsonDeserializer<Node>
{
  @Override
  public NodeData deserialize(...)
  {
    Long source (Long)context.getAttribute("SOURCE");
    Long id = parser.getLongValue();
    return NodeDataService.INSTANCE.get(source, id);
  }
}

这可行,但我在问自己,是否有更简单的方法来实现这一点。

这个问题看起来是可能的,就像我在第一次尝试中所做的那样 - 但仅在序列化时: Jackson How to retrieve parent bean in a custom Serializer/Deserializer

【问题讨论】:

    标签: json jackson deserialization customization


    【解决方案1】:

    getCurrentValue() 将返回 null,因为您已输入新的 JSON 对象但尚未设置当前值。您需要查看解析器上下文中的反序列化值堆栈。

    我在这里回答了类似的问题,这是您链接到的序列化问题的反序列化等效项:Jackson JSON gives exception on collection of nested class

    总而言之,您可以获得流上下文:

    JsonStreamContext ourContext = p.getParsingContext();
    

    然后在上下文中反复调用getParent() 以向上走,调用getCurrentValue()。只要标准 bean 反序列化器构造对象,该值就会设置到流上下文中。

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多