2012-04-11 1 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 был достаточно умен, чтобы по возможности прибегать к правильному типу, и что это было бы безопаснее, чем литье себя ... –

+1

Это интересная идея - может быть, такой код можно было бы добавить? Имя «конвертировать» предназначено для преобразования; а не просто бросить, но я думаю, это не необоснованное ожидание. Для этого я напишу исправление. – StaxMan

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? –

+0

readTree вы можете выбрать, когда у вас нет точного типа объекта. а readValue - если вы точно знаете тип объекта. –

Смежные вопросы