2012-04-11 34 views
14

Tôi mới bắt đầu sử dụng thư viện JSON JSON. Jackson là một thư viện rất mạnh, nhưng nó có một API rộng lớn khủng khiếp. Rất nhiều thứ có thể được thực hiện theo nhiều cách. Điều này khiến bạn khó tìm đường đến Jackson - làm thế nào để biết cách làm đúng/tốt nhất là gì?readValue và readTree ở Jackson: khi nào nên sử dụng?

Tại sao tôi sẽ sử dụng giải pháp này:

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()); 
    } 
} 

Hơn một giải pháp như thế này:

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()); 
    } 
}  

Hoặc qua các giải pháp mà tôi đi qua sử dụng JsonFactory và JsonParser và các tùy chọn thậm chí có thể nhiều hơn nữa ...

Có vẻ như mee rằng mapper.readValue là phổ biến nhất và có thể được sử dụng trong nhiều trường hợp: đọc tới JsonNode, ObjectNode, ArrayNode, PoJo, v.v. Vậy tại sao tôi muốn chúng tôi e mapper.readTree?

Và cách tốt nhất để chuyển đổi một JsonNode thành một ObjectNode là gì? Chỉ cần truyền tới ObjectNode? Hoặc sử dụng một cái gì đó như mapper.convertValue?

Trả lời

12

readValue() có thể được sử dụng cho bất kỳ và tất cả các loại, bao gồm JsonNode. readTree() chỉ hoạt động cho JsonNode (mô hình cây); và được thêm vào để thuận tiện.

Lưu ý rằng bạn KHÔNG BAO GIỜ muốn sử dụng ví dụ đầu tiên của mình: nó tương đương với việc viết ra nút của bạn dưới dạng JSON, sau đó đọc lại nó - chỉ cần truyền nó.

+0

cảm ơn, đây là thông tin hữu ích. Tôi giả định rằng convertValue đủ thông minh để chỉ đưa vào đúng loại khi có thể và nó sẽ an toàn hơn là tự đúc mình ... –

+1

Đó là một ý tưởng thú vị - có lẽ mã đó có thể được thêm vào? Tên 'chuyển đổi' có nghĩa là chuyển tải chuyển đổi; không chỉ đơn giản là diễn xuất, nhưng tôi đoán đó không phải là kỳ vọng vô lý. Tôi sẽ gửi một vấn đề cải tiến cho việc này. – StaxMan

4

đọc giá trị có thể được sử dụng cho các lớp học java của riêng bạn:

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); 

Tức là readTree bạn có thể chọn khi bạn không có loại chính xác của đối tượng. trong khi readValue - khi bạn biết chắc chắn loại đối tượng.

+0

Thật vậy, đó là một trong những điều làm cho readValue có thể sử dụng được trong các tình huống amore hơn so với readTree, vậy tại sao lại chọn readTree trên readValue? –

+0

readTree bạn có thể chọn khi bạn không có loại chính xác của đối tượng. while readValue - khi bạn biết chắc chắn loại đối tượng. –

Các vấn đề liên quan