Подтвердить что ты не робот

ReadValue и readTree в Джексоне: когда использовать что?

Я только начинаю использовать библиотеку Jackson JSON. Джексон - очень мощная библиотека, но у нее очень обширный API. Многое можно сделать несколькими способами. Это затрудняет поиск вашего пути в Джексоне - как узнать, что является правильным/лучшим способом делать вещи?

Почему я должен использовать это решение:

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 и т.д. Итак, почему я хотел бы использовать mapper.readTree?

И какой лучший способ преобразовать JsonNode в ObjectNode? Просто добавлено в ObjectNode? Или используйте что-то вроде mapper.convertValue?

4b9b3361

Ответ 1

readValue() может использоваться для любого и всех типов, включая JsonNode. readTree() работает только для JsonNode (древовидная модель); и добавляется для удобства.

Обратите внимание, что вы НИКОГДА не хотите использовать свой первый пример: он эквивалентен выписыванию вашего node в качестве JSON, а затем его чтение - просто отрисуйте его.

Ответ 2

Значение чтения может использоваться для ваших собственных классов 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 - если вы точно знаете тип объекта.