2015-10-06 78 views
0

我有一個實體訂單,並與OrderType實體有多對一的關係。傑克遜與休眠序列化,以避免枚舉

Order{ 
    OrderType type; 
} 

OrderType{ 
    int id; 
    String tag; //This field is uniq 
} 

都是hibernate實體。當我連載(使用傑克遜)我收到類型爲對象,以類似

"type" : { 
    "id":1, 
    "tag" : "TEST" 
} 

但我寧願顯示我的類型

"type" : "TEST" 

同樣而deserialising我需要的訂單類型的對象是甚至創建類型的值將是它的字符串等價。

"type" : "TEST"應該建立

{ 
    "id":1, 
    "tag" : "TEST" 
} 

,並且必須由唯一的字段標籤映射一個休眠對象,櫃面字符串具有不存在需要拋出的異常。

有人可以建議我實現它的最好方法。

回答

0

根據Jackson docs,你可以嘗試註釋來獲得你的不同的json字段,並忽略等。同樣的問題和答案是here喜歡這種情況。

Order{ 
    @JsonUnwrapped 
    OrderType type; 
} 

OrderType{ 
    @JsonIgnore 
    int id; 
    @JsonProperty("type") 
    String tag; 
} 

應該產生{"type":"typeValue"}當你序列化訂單實體。

+0

但它會重現數據庫的id值,當我反序列化它 – Ysak

+0

@Ysak可能不會,也有類似的方法http://stackoverflow.com/questions/12505141/only-using-jsonignore-during-serialization-but不是反序列化,但不是枚舉,可能是你可以把它包裝成另一個類,然後只給JsonIgnore註釋getter。 –

0

看看傑克遜定製串行器和反串行器。他們是用於創建自定義序列化和反序列化對象圖的Jackson 2功能。請參閱文章herehere

0

序列化:只需將@JsonValue註釋添加到OrderType.tag字段(或getter方法)。

反序列化:您可以添加靜態@JsonCreator -annotated方法:

public class OrderType { 
    @JsonCreator public static OrderType fromJson(String tagText) { 
    } 
} 

如果你可以很容易地在這個靜態方法與當前線程的Hibernate session保持,那麼你可以簡單地填寫實現來查詢訂單類型。