我模型中的所有类都是公共基类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
答案 0 :(得分:1)
getCurrentValue()
将返回null。您需要在解析器上下文中查看反序列化值的堆栈。
我在这里回答了类似的内容,这是与您链接的序列化问题的反序列化等效项:Jackson JSON gives exception on collection of nested class
总之,您可以获取流上下文:
JsonStreamContext ourContext = p.getParsingContext();
然后在上下文中反复调用getParent()
以向上行,调用getCurrentValue()
。一旦标准bean反序列化器构造对象,该值就会设置到流上下文中。