2012-04-11 18 views
14

Estoy empezando a usar la biblioteca Jackson JSON. Jackson es una biblioteca muy poderosa, pero tiene una API terriblemente extensa. Se pueden hacer muchas cosas de múltiples maneras. Esto hace que sea difícil encontrar tu camino en Jackson, ¿cómo saber cuál es la forma correcta/mejor de hacer las cosas?readValue y readTree en Jackson: ¿cuándo usar qué?

Por qué debería utilizar esta solución:

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

Durante una solución como esta:

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

o más soluciones que me encontré con el uso de JsonFactory y JsonParser y tal vez incluso más opciones ...

Me parece que mapper.readValue es el más genérico y se puede usar en muchos casos: lea JsonNode, ObjectNode, ArrayNode, PoJo, etc. Entonces, ¿por qué querríamos nosotros? e mapper.readTree?

¿Y cuál es la mejor manera de convertir un JsonNode en un ObjectNode? ¿Simplemente enviar a ObjectNode? O use algo como mapper.convertValue?

Respuesta

12

readValue() se puede utilizar para todos los tipos, incluido JsonNode. readTree() solo funciona para JsonNode (modelo de árbol); y se agrega para mayor comodidad.

Tenga en cuenta que NUNCA desea utilizar su primer ejemplo: es equivalente a escribir su nodo como JSON, y luego leerlo de nuevo, simplemente emitirlo.

+0

gracias, esta es información útil. Supuse que convertValue era lo suficientemente inteligente como para simplemente lanzar al tipo correcto cuando fuera posible y que sería más seguro que lanzarme ... –

+1

Esa es una idea interesante, ¿tal vez podría agregarse ese código? El nombre 'convertir' está destinado a transmitir la conversión; no simplemente lanzar, pero supongo que no es una expectativa irracional. Voy a presentar un problema de mejora para esto. – StaxMan

4

Leer valor se puede utilizar para sus propias clases 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); 

es decir, readTree puede elegir cuando no hay un tipo exacto del objeto. mientras que readValue - cuando conoces el tipo de objeto seguro.

+0

De hecho, esa es una de las cosas que hace que readValue se pueda utilizar en más situaciones que readTree, así que ¿por qué elegir readTree sobre readValue? –

+0

readTree puede elegir cuando no hay un tipo exacto del objeto. while readValue - cuando conoces el tipo de objeto seguro. –

Cuestiones relacionadas