Tutorial de Api Jackson
Jackson es una popular biblioteca Java para trabajar con JSON. Una de las características útiles de Jackson es su clase JsonNode
, que representa un nodo en un árbol JSON. En este tutorial, aprenderás cómo utilizar JsonNode
para leer y manipular datos JSON.
Una vez que tienes Jackson en tu proyecto, puedes utilizar ObjectMapper
para convertir una cadena JSON en un árbol JsonNode
. El siguiente ejemplo muestra cómo hacerlo:
package com.ejemplos.jackson;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
try {
String jsonString = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonString);
JsonNode nameNode = jsonNode.get("name");
String name = nameNode.asText();
System.out.println(name);
}catch (Exception e) {
e.printStackTrace();
}
}
}
Aquí se presentan algunos de los métodos más comunes de la clase JsonNode
con sus explicaciones:
get(String fieldName)
- Devuelve el valor de un campo específico como unJsonNode
.path(String fieldName)
- Devuelve el valor de un campo específico como unJsonNode
, o un nodo nulo si el campo no existe.getNodeType()
- Devuelve el tipo de nodo, como objeto, matriz, valor de cadena, etc.isArray()
- Devuelvetrue
si el nodo es un array,false
en caso contrario.isObject()
- Devuelvetrue
si el nodo es un objeto JSON,false
en caso contrario.isValueNode()
- Devuelvetrue
si el nodo es un valor JSON (cadena, número, booleano, nulo),false
en caso contrario.asText()
- Devuelve el valor de un nodo como una cadena de texto.asBoolean()
- Devuelve el valor de un nodo como un valor booleano.asInt()
- Devuelve el valor de un nodo como un valor entero.asDouble()
- Devuelve el valor de un nodo como un valor de doble precisión.elements()
- Devuelve un iterador que recorre los elementos de un array.fieldNames()
- Devuelve un iterador que recorre los nombres de campo en un objeto JSON.findValue(String fieldName)
- Busca un valor en el árbol JSON utilizando el nombre del campo.findValues(String fieldName)
- Busca una lista de valores en el árbol JSON utilizando el nombre del campo.findPath(String fieldName)
- Busca un nodo en el árbol JSON utilizando el nombre del campo, y devuelve un nodo nulo si no se encuentra.findParents(String fieldName)
- Busca una lista de nodos padres en el árbol JSON utilizando el nombre del campo.
Recorrer un array de objetos JSON
package com.ejemplos.jackson;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
try {
String jsonString = "[{ \"name\": \"John\", \"age\": 30 }, { \"name\": \"Jane\", \"age\": 25 }]";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNodes = objectMapper.readTree(jsonString);
for (JsonNode node : jsonNodes) {
String name = node.get("name").asText();
int age = node.get("age").asInt();
System.out.println(name);
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
Crear ObjectNode
ObjectNode
es una clase de Jackson que representa un nodo de objeto JSON. Puedes crear un nuevo objeto ObjectNode
utilizando el constructor sin argumentos:
Una vez que tienes un objeto ObjectNode
, puedes agregar campos y valores utilizando los métodos put()
y set()
:
package com.ejemplos.jackson;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class EjemploJackson {
public static void main(String[] args) {
try {
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode objectNode = objectMapper.createObjectNode();
ObjectNode addressNode = objectMapper.createObjectNode();
addressNode.put("street", "123 Main St.");
addressNode.put("city", "Anytown");
addressNode.put("state", "CA");
addressNode.put("zip", "12345");
objectNode.set("address", addressNode);
String json = objectNode.toString();
System.out.println(json);
}catch (Exception e) {
e.printStackTrace();
}
}
}
{
"name" : "John",
"age" : 30,
"address" : {
"street" : "123 Main St.",
"city" : "Anytown",
"state" : "CA",
"zip" : "12345"
}
}
Para eliminar un campo de un objeto ObjectNode
de Jackson, puedes utilizar el método remove(String fieldName)
y pasar el nombre del campo que deseas eliminar como argumento. El método devolverá el nodo eliminado, o null
si el campo no existe.
Por ejemplo, supongamos que tenemos el siguiente objeto JSON:
{
"name": "John",
"age": 30,
"address": {
"street": "123 Main St.",
"city": "Anytown",
"state": "CA",
"zip": "12345"
}
}
package com.ejemplos.jackson;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class EjemploJackson {
public static void main(String[] args) {
try {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree("{\"name\":\"John\",\"age\":30,\"address\":{\"street\":\"123 Main St.\",\"city\":\"Anytown\",\"state\":\"CA\",\"zip\":\"12345\"}}");
ObjectNode objectNode = (ObjectNode) jsonNode;
JsonNode removedNode = objectNode.remove("age");
System.out.println(objectNode.toString());
}catch (Exception e) {
e.printStackTrace();
}
}
}
En este ejemplo, utilizamos el método readTree()
de ObjectMapper
para convertir la cadena JSON en un objeto JsonNode
. Luego, lo convertimos en un objeto ObjectNode
utilizando una conversión explícita de tipo.
Después, llamamos al método remove()
en el objeto ObjectNode
para eliminar el campo "age". En este caso, el método devuelve el nodo eliminado, que podemos ignorar. Finalmente, imprimimos el objeto ObjectNode
modificado utilizando el método toString()
. Este es el resultado:
{
"name" : "John",
"address" : {
"street" : "123 Main St.",
"city" : "Anytown",
"state" : "CA",
"zip" : "12345"
}
}