【发布时间】: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