2015-11-22 17 views
0

我的模型中的所有类都是公共基类节点的子类。 在使用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()总是返回空。

到目前为止,我的最佳解决方案是编写一对合并解串器。 第一个注释属性源的获取者,并将该值存储为每个呼叫属性的 。第二个看起来是这样的:

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); 
    } 
} 

这工作,但我问自己,如果没有达到这个更简单的方法。

这个问题看起来是可能的,就像我在我的第一次尝试做到了 - 但只有在序列化:因为你已经进入了一个新的JSON对象,但尚未设定 Jackson How to retrieve parent bean in a custom Serializer/Deserializer

回答

1

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

我回答这里类似的东西,这是反序列化相当于你链接到序列化的问题:Jackson JSON gives exception on collection of nested class

总之,你可以得到流上下文:

JsonStreamContext ourContext = p.getParsingContext(); 

,然后反复调用getParent()上上下文链接,呼吁getCurrentValue()。只要标准bean反序列化器构造对象,该值就被设置到流上下文中。