Tutorial de Api Jackson
La clase ObjectMapper
com.fasterxml.jackson.databind.ObjectMapper
es la forma más sencilla de analizar JSON. ObjectMapper puede analizar JSON a partir de una cadena o archivo. El análisis de JSON en objetos Java también se conoce como deserializar objetos Java .
ObjectMapper también puede crear JSON a partir de objetos Java. La generación de JSON a partir de objetos de Java también se denomina serializar objetos de Java en JSON.
Serializar Objeto Java a JSON
Veamos un primer ejemplo de serialización de un objeto Java en JSON usando el método writeValue de la clase ObjectMapper:
Clase Car.java
package com.ejemplos.jackson;
public class Car {
private String brand = null;
private int doors = 0;
public String getBrand() {
return this.brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public int getDoors() {
return this.doors;
}
public void setDoors(int doors) {
this.doors = doors;
}
}
Clase EjemploJackson.java
package com.ejemplos.jackson;
import java.io.File;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
Car car = new Car();
car.setBrand("Mercedes");
car.setDoors(5);
try {
objectMapper.writeValue(new File("target/car.json"), car);
} catch (Exception e) {
e.printStackTrace();
}
}
}
La salida del siguiente ejemplo es el archivo "car.json" será:
{"brand":"Mercedes","doors":5}
Los métodos writeValueAsString y writeValueAsBytes de la clase ObjectMapper generan un JSON a partir de un objeto Java y devuelven el JSON generado una cadena o una matriz de bytes:
package com.ejemplos.jackson;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
Car car = new Car();
car.setBrand("Mercedes");
car.setDoors(5);
try {
String json = objectMapper.writeValueAsString(car);
System.out.println(json);
}catch (Exception e) {
e.printStackTrace();
}
}
}
Serializar Lista de Objetos Java a JSON
Ejemplo de serialización de una lista de objetos Java en JSON usando el método writeValue de la clase ObjectMapper:
Clase EjemploJackson.java
package com.ejemplos.jackson;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
List<Car> list = new ArrayList<Car>();
Car car = new Car();
car.setBrand("Mercedes");
car.setDoors(5);
list.add(car);
car = new Car();
car.setBrand("BMW");
car.setDoors(4);
list.add(car);
try {
String json = objectMapper.writeValueAsString(list);
System.out.println(json);
}catch (Exception e) {
e.printStackTrace();
}
}
}
La salida del siguiente ejemplo es:
[{"brand":"Mercedes","doors":5},{"brand":"BMW","doors":4}]
JSON a Objeto Java
A continuación se muestra un ejemplo simple de cómo convertir una cadena JSON en un objeto Java utilizando la clase ObjectMapper:
package com.ejemplos.jackson;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
String json = "{\"brand\":\"Mercedes\",\"doors\":5}";
try {
Car car = objectMapper.readValue(json, Car.class);
}catch (Exception e) {
e.printStackTrace();
}
}
}
La función readValue() también acepta otras formas de entrada.
- Clase Reader
package com.ejemplos.jackson;
import java.io.Reader;
import java.io.StringReader;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
String json = "{\"brand\":\"Mercedes\",\"doors\":5}";
try {
Reader reader = new StringReader(json);
Car car = objectMapper.readValue(reader, Car.class);
}catch (Exception e) {
e.printStackTrace();
}
}
}
- Archivo JSON
Archivo car.json
{"brand":"Mercedes","doors":5}
Clase EjemploJackson.java
package com.ejemplos.jackson;
import java.io.File;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
try {
File file = new File("data/car.json");
Car car = objectMapper.readValue(file, Car.class);
}catch (Exception e) {
e.printStackTrace();
}
}
}
- URL JSON
Contenido de la URL "file:data/car.json"
{"brand":"Mercedes","doors":5}
Clase EjemploJackson.java
package com.ejemplos.jackson;
import java.net.URL;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
try {
URL url = new URL("file:data/car.json");
Car car = objectMapper.readValue(url, Car.class);
}catch (Exception e) {
e.printStackTrace();
}
}
}
- Clase InputStream
Archivo car.json
{"brand":"Mercedes","doors":5}
Clase EjemploJackson.java
package com.ejemplos.jackson;
import java.io.FileInputStream;
import java.io.InputStream;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
try {
InputStream input = new FileInputStream("data/car.json");
Car car = objectMapper.readValue(input, Car.class);
}catch (Exception e) {
e.printStackTrace();
}
}
}
JSON a Array Java
A continuación se muestra un ejemplo simple de cómo convertir una cadena JSON en un Array de datos en Java utilizando la clase ObjectMapper:
package com.ejemplos.jackson;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
try {
String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";
Car[] cars = objectMapper.readValue(jsonArray, Car[].class);
}catch (Exception e) {
e.printStackTrace();
}
}
}
JSON a Lista Java
A continuación se muestra un ejemplo simple de cómo convertir una cadena JSON en una lista Java utilizando la clase ObjectMapper:
package com.ejemplos.jackson;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
try {
String jsonArray = "[{\"brand\":\"ford\"}, {\"brand\":\"Fiat\"}]";
List<Car> cars = objectMapper.readValue(jsonArray, new TypeReference<List<Car>>(){});
}catch (Exception e) {
e.printStackTrace();
}
}
}
JSON a Map Java
package com.ejemplos.jackson;
import java.util.Map;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
try {
String json = "{\"brand\":\"Mercedes\",\"doors\":5}";
Map<String, Object> map = objectMapper.readValue(json,new TypeReference<Map<String,Object>>(){});
}catch (Exception e) {
e.printStackTrace();
}
}
}
Ignorar campos desconocidos en la Deserialización
Al convertir objetos JSON a clases Java, en caso de que la cadena JSON tenga algunos campos nuevos, el proceso predeterminado generará una excepción UnrecognizedPropertyException:
package com.ejemplos.jackson;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
try {
String json = "{\"brand\":\"Mercedes\",\"doors\":5}";
Car car = objectMapper.readValue(json,Car.class);
}catch (Exception e) {
e.printStackTrace();
}
}
}
Permitir los valores nulos para valores primitivos
Si una cadena JSON contiene un campo con su valor establecido en nulo, para un campo que en el objeto Java correspondiente es de tipo primitivo (int, long, float, double, etc.)
package com.ejemplos.jackson;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
try {
String json = "{\"brand\":\"Mercedes\",\"doors\":null}";
Car car = objectMapper.readValue(json,Car.class);
}catch (Exception e) {
e.printStackTrace();
}
}
}
Controla si los valores de enumeración pueden serializarse/deserializarse como números
package com.ejemplos.jackson;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class EjemploJackson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS, false);
try {
String json = "{\"brand\":\"Mercedes\",\"doors\":5}";
Car car = objectMapper.readValue(json,Car.class);
}catch (Exception e) {
e.printStackTrace();
}
}
}
A continuación se muestran todas las variables disponibles en la clase DeserializationFeature
de la biblioteca Jackson JSON para Java:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES,false);
ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT
: Si se habilita esta opción, Jackson tratará un arreglo JSON vacío como un objeto nulo en lugar de arrojar una excepciónJsonMappingException
.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT
: Si se habilita esta opción, Jackson tratará una cadena JSON vacía como un objeto nulo en lugar de arrojar una excepciónJsonMappingException
.ACCEPT_SINGLE_VALUE_AS_ARRAY
: Si se habilita esta opción, Jackson tratará un valor único (no un arreglo) como un arreglo de un solo elemento en lugar de arrojar una excepciónJsonMappingException
.FAIL_ON_IGNORED_PROPERTIES
: Si se habilita esta opción, Jackson arrojará una excepciónUnrecognizedPropertyException
si un objeto JSON contiene una propiedad que no está presente en la clase Java que se está deserializando.FAIL_ON_INVALID_SUBTYPE
: Si se habilita esta opción, Jackson arrojará una excepciónInvalidTypeIdException
si un objeto JSON hace referencia a un subtipo que no es válido.FAIL_ON_MISSING_CREATOR_PROPERTIES
: Si se habilita esta opción, Jackson arrojará una excepciónJsonMappingException
si un objeto JSON que se está deserializando no tiene valores para todas las propiedades requeridas por el constructor de la clase Java.FAIL_ON_NULL_CREATOR_PROPERTIES
: Si se habilita esta opción, Jackson arrojará una excepciónJsonMappingException
si un objeto JSON que se está deserializando tiene valores nulos para propiedades que son requeridas por el constructor de la clase Java.FAIL_ON_NULL_FOR_PRIMITIVES
: Si se habilita esta opción, Jackson arrojará una excepciónJsonMappingException
si un objeto JSON que se está deserializando tiene un valor nulo para un tipo de dato primitivo en la clase Java.FAIL_ON_NUMBERS_FOR_ENUMS
: Si se habilita esta opción, Jackson arrojará una excepciónJsonMappingException
si un objeto JSON que se está deserializando usa un valor numérico en lugar de una cadena para representar un valor de enumeración en la clase Java.FAIL_ON_READING_DUP_TREE_KEY
: Si se habilita esta opción, Jackson arrojará una excepciónJsonProcessingException
si encuentra una clave duplicada al leer un árbol JSON.FAIL_ON_UNKNOWN_PROPERTIES
: Si se habilita esta opción, Jackson arrojará una excepciónUnrecognizedPropertyException
si un objeto JSON contiene una propiedad que no está presente en la clase Java que se está deserializando.UNWRAP_SINGLE_VALUE_ARRAYS
: Si se habilita esta opción, Jackson tratará un arreglo JSON de un solo elemento como el valor único en lugar de un arreglo de un solo elemento al deserializar, y se ignorará al serializar.USE_BIG_DECIMAL_FOR_FLOATS
: Si se habilita esta opción, Jackson usaráBigDecimal
en lugar dedouble
para deserializar valores de punto flotante.USE_BIG_INTEGER_FOR_INTS
: Si se habilita esta opción, Jackson usaráBigInteger
en lugar de
MapperFeature
es una enumeración de características que pueden ser activadas o desactivadas en el mapeador de objetos Jackson. A continuación se muestra una lista de las propiedades de MapperFeature:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES,true);
ACCEPT_CASE_INSENSITIVE_PROPERTIES
: Permite que las propiedades se mapeen de manera insensible a mayúsculas y minúsculas.ALLOW_COERCION_OF_SCALARS
: Permite la coerción de tipos de datos escalares como enteros y flotantes.AUTO_DETECT_CREATORS
: Detecta automáticamente constructores y métodos de fábrica para la creación de instancias.AUTO_DETECT_FIELDS
: Detecta automáticamente los campos de una clase para ser serializados.AUTO_DETECT_GETTERS
: Detecta automáticamente los métodos getter de una clase para ser serializados.AUTO_DETECT_IS_GETTERS
: Detecta automáticamente los métodos booleanos de una clase para ser serializados.CAN_OVERRIDE_ACCESS_MODIFIERS
: Permite que Jackson sobrescriba los modificadores de acceso de una clase para acceder a sus campos y métodos.DEFAULT_VIEW_INCLUSION
: Incluye automáticamente los valores de la vista predeterminada en la serialización.IGNORE_DUPLICATE_MODULE_REGISTRATIONS
: Ignora las registraciones de módulos duplicados.INFER_PROPERTY_MUTATORS
: Permite la inferencia de los mutadores de las propiedades de una clase.INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIES
: Permite la inferencia de los parámetros del constructor a partir de las propiedades de la clase.SORT_PROPERTIES_ALPHABETICALLY
: Ordena las propiedades de la clase alfabéticamente antes de la serialización.USE_ANNOTATIONS
: Usa anotaciones de Jackson para determinar qué campos y métodos deben ser serializados.USE_GETTERS_AS_SETTERS
: Permite que Jackson use los métodos getter como setters para establecer los valores de las propiedades.