2012-04-11 53 views
14

我剛開始使用Jackson JSON庫。傑克遜是一個非常強大的圖書館,但它擁有非常廣泛的API。很多事情可以通過多種方式完成。這使得很難在傑克遜找到自己的方式 - 如何知道做什麼是正確的/最好的做法?傑克遜readValue和readTree:何時使用哪個?

爲什麼要使用此解決方案:

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}"; 
ObjectMapper mapper = new ObjectMapper(); 
JsonNode node = mapper.readValue(json, JsonNode.class); 
if (node.isObject()) { 
    ObjectNode obj = mapper.convertValue(node, ObjectNode.class); 
    if (obj.has("a")) { 
     System.out.println("a=" + obj.get("a").asDouble()); 
    } 
} 

在這樣一個解決方案:

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}"; 
ObjectMapper mapper = new ObjectMapper(); 
JsonNode node = mapper.readTree(json); 
if (node.isObject()) { 
    ObjectNode obj = (ObjectNode) node; 
    if (obj.has("a")) { 
     System.out.println("a=" + obj.get("a").asDouble()); 
    } 
}  

或者過度的解決方案,我碰到使用JsonFactory和JsonParser,甚至更多的選擇...

在我看來,mapper.readValue是最通用的,可以在很多情況下使用:讀到JsonNode,ObjectNode,ArrayNode,PoJo等。爲什麼我要我們e mapper.readTree?

什麼是將JsonNode轉換爲ObjectNode的最佳方式?只需投射到ObjectNode?或者使用類似mapper.convertValue的東西?

回答

12

readValue()可用於任何和所有類型,包括JsonNode。 readTree()僅適用於JsonNode(樹型);並且爲了方便而添加。

請注意,您永遠不想使用您的第一個示例:它相當於將節點寫出爲JSON,然後將其讀回 - 只需將其施放。

+0

謝謝,這是有用的信息。我認爲convertValue足夠聰明,只要可能就投射到正確的類型,並且比投射自己更安全...... – 2012-04-16 08:13:45

+1

這是一個有趣的想法 - 也許這樣的代碼可以添加?名稱「轉換」是爲了表達轉換;不是簡單地演員,但我想這不是不合理的期望。我將爲此提出改進問題。 – StaxMan 2012-04-17 18:32:12

4

讀值可用於自己的Java類:

public class Foo { 
    private int a; 
    private String b; 
    private double[] c; 

    // getters/setters 
} 

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}"; 
ObjectMapper mapper = new ObjectMapper(); 
Foo foo = mapper.readValue(json, Foo.class); 

readTree你可以選擇當你沒有確切類型的對象。而readValue - 當你知道確切的對象類型。

+0

確實,這是使readValue可以在比readTree更加友好的情況下使用的一種方法,所以爲什麼選擇readTree而不是readValue? – 2012-04-12 07:04:39

+0

readTree你可以選擇何時你沒有確切類型的對象。而readValue - 當你知道確切的對象類型。 – 2012-04-12 15:19:20