2014-03-24 66 views
2

目前,我做這樣的事情:有沒有辦法讓一個「通用」json對象?

public class MyObject{ 
    public String name; 
    //constructor here 
} 

所以,如果我把它序列化:

ObjectMapper mapper = new ObjectMapper(); 
MyObject o = new MyObject("peter"); 
mapper.writeValue(System.out,o); 

我得到

{"name":"peter"} 

我想使這個通用的,所以類將是:

public class MyObject{ 
    public String name; 
    public String value; 
    //constructor here 
} 

所以,這個調用:

ObjectMapper mapper = new ObjectMapper(); 
MyObject o = new MyObject("apple","peter"); 
mapper.writeValue(System.out,o); 

會導致

{"apple":"peter"} 

這可能嗎?

+5

只是序列化地圖 – soulcheck

+0

您可以創建任何JSON值的JsonNode實例 – fge

+0

只需使用地圖和列表即可。傑克遜對於如何強制你創建精心設計的「POJO」來表示清晰高效地表示爲地圖和列表的數據非常可憎。 –

回答

1

您似乎在尋求一種方法來存儲一般命名的屬性及其值,然後將它們呈現爲JSON。一個Properties是一個很好的自然表現,以及ObjectMapper知道如何序列化此:

ObjectMapper mapper = new ObjectMapper(); 

Properties p = new Properties(); 
p.put("apple", "peter"); 
p.put("orange", "annoying"); 
p.put("quantity", 3); 
mapper.writeValue(System.out, p); 

輸出:

{"apple":"peter","orange":"annoying","quantity":3}  

雖然這是真的,你可以從頭開始建立ObjectNode S,使用ObjectNode到存儲數據可能會導致Jackson與您的內部業務邏輯之間的不良聯繫。如果您可以使用更合適的現有對象,例如PropertiesMap的任何變體,則可以使JSON端與數據保持隔離。

此外:從概念上講,你想問「我的對象是什麼?」

  • 它是一個JSON對象節點嗎?然後考慮ObjectNode
  • 它是一個屬性的集合?然後考慮Properties
  • 它是不是屬性的常規a - > b映射(例如,字符串集合 - >頻率計數)?然後考慮另一種類型Map

傑克遜可以處理所有這些。

+1

簡單的舊HashMap有什麼問題? –

+0

@HotLicks除了'Properties'有明確的自我記錄意圖之外什麼也沒有。但任何舊的'Map'都可以完成工作,就純功能而言。請注意''屬性'實現'Map'。無論如何,真正的迴歸點是使用獨立於Jackson的對象來存儲數據。 –

1

而是通過的POJO,你可以直接使用傑克遜的API:

private static final JsonNodeFactory FACTORY = JsonNodeFactory.instance; 

// 

final ObjectNode node = FACTORY.objectNode(); 
node.put("apple", "peter"); 
// etc 

可以嵌套你想以及許多節點。

相關問題