web-dev-qa-db-fra.com

readValue et readTree à Jackson: quand utiliser quoi?

Je commence tout juste à utiliser la bibliothèque Jackson JSON. Jackson est une bibliothèque très puissante, mais elle possède une API terriblement étendue. Beaucoup de choses peuvent être faites de plusieurs manières. Cela rend difficile de trouver votre chemin à Jackson - comment savoir quelle est la bonne/meilleure façon de faire les choses?

Pourquoi devrais-je utiliser cette solution:

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

Sur une solution comme celle-ci:

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

Ou sur des solutions que j'ai rencontrées en utilisant JsonFactory et JsonParser et peut-être même plus d'options ...

Il me semble que mapper.readValue est le plus générique et peut être utilisé dans de nombreux cas: lecture vers JsonNode, ObjectNode, ArrayNode, PoJo, etc. Alors pourquoi voudrais-je utiliser mapper.readTree?

Et quelle est la meilleure façon de convertir un JsonNode en un ObjectNode? Vous venez de caster sur ObjectNode? Ou utilisez quelque chose comme mapper.convertValue?

23
Jos de Jong

readValue () peut être utilisé pour tous les types, y compris JsonNode. readTree () ne fonctionne que pour JsonNode (modèle d'arbre); et est ajouté pour plus de commodité.

Notez que vous ne voulez JAMAIS utiliser votre premier exemple: cela équivaut à écrire votre nœud en JSON, puis à le relire - il suffit de le caster.

21
StaxMan

La valeur de lecture peut être utilisée pour vos propres classes 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);

c'est-à-dire que vous pouvez choisir readTree lorsque vous ne connaissez pas le type exact de l'objet, et readValue lorsque vous connaissez le type d'objet à coup sûr.

9
Eugene Retunsky