从自定义反序列化器访问反序列化对象

时间:2015-11-22 13:29:44

标签: json jackson deserialization customization

我模型中的所有类都是公共基类Node的子类。 使用Jackson序列化/反序列化时,我希望将其他对象的引用替换为其ID。问题是,ID是两个值的组合:实例本身的ID和源的ID。我使用自定义序列化器和反序列化器来完成此操作。

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

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

但是当deserilizing时,我需要知道源的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

1 个答案:

答案 0 :(得分:1)

当您输入新的JSON对象但尚未设置当前值时,

getCurrentValue()将返回null。您需要在解析器上下文中查看反序列化值的堆栈。

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

总之,您可以获取流上下文:

JsonStreamContext ourContext = p.getParsingContext();

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