2015-11-22 62 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反序列化器構造對象,該值就被設置到流上下文中。