2016-06-28 126 views
1

我有一個類:Java如何在序列化過程中使用Jackson ObjectMapper來連接Item類中的兩個字段?

public class Item { 
    private String firstName; 
    private String lastName; 
    private int age; 
} 

當我將其轉換爲JSON,我想的名字和姓氏字段組合。因此,像:

ObjectMapper objMapper = createMapper(); 
Item item = new Item("Bob", "Smith", 190); 
String json = objMapper.writeValueAsString(item); 

但我想的JSON看起來如下:

{ 
    "Name": "Bob Smith", 
    "age" : "190" 
} 

代替:

{ 
    "firstName": "Bob", 
    "lastName" : "Smith", 
    "age" : "190" 
} 

一樣聰明,我想走另一條路周圍。所以,如果字符串anotherString是,

{ 
    "Name": "Jon Guy", 
    "age" : "20" 
} 

objMapper.readValue(anotherString, Item); 

應該產生一個項目與姓=喬恩,姓氏=蓋伊,年齡= 20

+0

不要連接那個值。寫一個新的get方法:public getName(){return firstName +「」+ lastName);} – Stefan

+0

這對於將JSON轉換爲Item對象的逆向過程仍然有效嗎?我可以將JSON字段「Name」轉換爲「firstName」和「lastName」嗎? – user3768533

回答

1

作爲一般的擡起頭來,https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations會告訴你什麼樣的註解會幫助你與傑克遜的東西。

無論如何,兩件事情都發生在這裏:

  • 要序列的附加字段
  • 你想從你的對象進行解析附加字段(我其實告誡這個下文)

我假設你想存儲名稱字段在一起,可能用於顯示的目的。

根據我的經驗,我會告誡你不要真正從任何傳入的JSON解析fullName屬性,因爲它實際上並非微不足道(例如,想象一個名爲Lauren de Silva的人)。

的解決方案,我要提出是要與序列化的名稱屬性的對象,但會忽略當對象被讀回該屬性。

我們現在要做的是自定義POJO,而不是做任何特殊的序列化代碼:

public class Item { 
    private String firstName; 
    private String lastName; 
    private int age; 

    @JsonProperty("Name",access=Access.READ_ONLY) 
    public String getName() { 
    return(firstName + " " + lastName); 
    } 
} 

我當然會建議增加空檢查到的各種方法,如果您的firstName或lastName的可能是空白或空。

+0

感謝您的回覆!我認爲你對反序列化是正確的,我會避免這樣做。對於序列化,我們實際上是在之後將JSON寫入數據庫。我們將使用「Name」作爲數據庫的哈希鍵。我的團隊堅持不要觸及Item類,並改變序列化,以便將來可以輕鬆修改散列鍵(通過更改序列化而不是Item類)。有沒有簡單的方法來做到這一點? – user3768533

+0

是的,有,你將需要創建一個自定義序列化程序。如果你想創建一個自定義的票,我也會覆蓋那個。 – TreyE

+0

如果還不算太晚,我想帶你參加這個活動:) http:// stackoverflow。COM /問題/ 38231692 /定製串行器和解串器對連擊兩字段-期間,serializatio – user3768533

相關問題