- Java 1.8
- IntellijIdea
En el archivo que permite ejecutar la aplicación (Runner.java), activar/desactivar comentarios para una mejor comprensión de la secuencoa de transformación de los objetos.
Acrónimo de Javascript Object Notation es un formato de texto sencillo para el intercambio de datos. Es un subconjunto de la notación literal de Objetos de Javascript y se ha adoptado como una alternativa al formato xml
para transferir datos en Internet. Los valores se expresan en formato clave:valor separados por coma (,). Un objeto se describe entre llaves así:
{
plate: "JIA764",
brand: "Renault",
model: 1977,
color: "Verde",
value: 2300000,
dateEnrollment: {
year:1977,
month:11,
day:17
},
state: false,
}
- Números: Representan valores numéricos positivos o negativos y pueden contener parte fraccionaria.
- Cadenas de Caracteres: Representan secuencias de caracteres alfanuméricos, se expresan entre comillas
- Booleanos: Representan valores lógicos, se expresan como
true
ofalse
- null: Representan un valor nullo
- Arreglos: Representan listas de cero o más valores de cualquier tipo separados por comas, dentro de un arreglo se pueden tener valores que representan objetos
Gson es una API en Java, desarrollada por Google, es utilizada para convertir objetos Java a JSON (Serialización) y JSON a objetos Java (deserialización). La librería estructura los componentes de la siguiente manera:
- JsonElement: Clase que representa cualquier elemento JSON que puede ser de alguno de los siguientes cuatro tipos:
- JsonObject: Clase que representa un objeto de JSON, es decir, un conjunto de pares clave-valor.
- JsonArray: Clase que representa un arreglo o colección de JSON. Es una lista de JsonElements cada uno de los cuales puede ser de un tipo diferente.
- JsonPrimitive: Clase que representa un tipo de dato primitivo u objeto de datos simple.
- JsonNull: Representa un objeto null.
Para poder usar la librería es necesario adionarla al proyecto en Java, se puede adicionar como dependencias del proyecto usando un gestor:
dependencies{
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.6'
}
<dependency>
<groupid>com.google.code.gson</groupid>
<artifactid>gson</artifactid>
<version>2.8.6</version>
</dependency>
Si no se usa un gestor de dependencias, agregar el archivo .jar al proyecto, según el IDE que se esté utilizando
En la carpeta lib
se encuentra para descarga el archivo .jar de la librería gson-2.8.6.
Para el ejemplo se usarán instancias de la siguiente clase:
El siguiente código en Java crea un objeto de la clase Car
, lo serializa como un objeto JSON y los visualiza.
Car renault = new Car("JIA764","Renault 4",(short)1977,"Verde",2_300_000,false, LocalDate.of(1996, Month.NOVEMBER,17));
String json = new Gson().toJson( renault );
System.out.println( json );
En la salida se debe observar que el atributo de fecha de matrícula (dateEnrollment) se convierte como un objeto JSON dentro del miusmo objeto JSON
Si se desea presentar la salida en un formato bonito (con saltos de línea), se usa una instancia de la clase GsonBuilder
que extiende a la clase Gson
. En el siguiente código se ilustra lo anterior.
Gson jsonPretty = new GsonBuilder().setPrettyPrinting().create();
System.out.println( jsonPretty.toJson( renault ) );
En el siguiente ejemplo se encuentra el código en Java que crea una colección de objetos y los serializa como una colección de objetos JSON
List<Car> cars = Arrays.asList(new Car("JIA764","Renault 4",(short)1977,"Verde",2_300_000,false, LocalDate.of(1996, Month.NOVEMBER,17)),
new Car("JJJ708","Renault 9",(short)1989,"Azul",10_400_000,true, LocalDate.of(1988, Month.JUNE,25)),
new Car("NOT560","Chevrolet Aveo",(short)2007,"Rojo",27_000_000,true, LocalDate.of(2007, Month.FEBRUARY,05)),
new Car("DZW615","Kia Picanto",(short)2018,"Gris",28_000_000,true, LocalDate.of(2017, Month.AUGUST,25)));
String jsonCars = jsonPretty.toJson( cars );
System.out.println( jsonCars );
Observar que en la salida la colección se especifica entre paréntesis cuadrados ([ ]), dentro de los cuales cada objeto se especifica entre llaves ({ })
A partir de un Elemento JSON, es posible obtener una instancia de una clase en Java. El elemento JSON se especifica como una cadena de texto con los valores en formato clave-valor. El siguiente ejemplo se crea un objeto JSON y se deserializa a un objeto de la clase Car
String strCar = "{\"plate\":\"DZW737\"," +
"\"brand\":\"Chevrolet Corsa Evolution\"," +
"\"model\":2004," +
"\"color\":\"Verde\"," +
"\"value\":12500000," +
"\"dateEnrollment\":{\"year\":2005,\"month\":04,\"day\":28}," +
"\"state\":true}";
Car corsa = new Gson().fromJson( strCar, Car.class );
System.out.println( corsa );
Las comillas dobles que describen el nombre de los atributos se deben escapar (\")
En el siguiente ejemplo se crea una colección de objetos JSON y se deserializan a un ArrayList de Java
String strCars = "[{\"plate\":\"DZW737\"," +
"\"brand\":\"Chevrolet Corsa Evolution\"," +
"\"model\":2004," +
"\"color\":\"Verde\"," +
"\"value\":12500000," +
"\"dateEnrollment\":{\"year\":2005,\"month\":04,\"day\":28}," +
"\"state\":true}," +
"{\"plate\":\"WLZ398\"," +
"\"brand\":\"Mazda CX5\"," +
"\"model\":2016," +
"\"color\":\"Rojo\"," +
"\"value\":78000000," +
"\"dateEnrollment\":{\"year\":2017,\"month\":01,\"day\":10}," +
"\"state\":true}]";
Type typeList = new TypeToken<List<Car>>(){}.getType();
List<Car> newCars = new Gson().fromJson(strCars, typeList );
System.out.printf("Se han deserializado %d Objetos%n",newCars.size());
newCars.forEach( car -> System.out.println( car ) );
Tener en cuenta que para
Type
se debe importar dejava.lang.reflect.Type
yTypeToken
decom.google.gson.reflect
El método fromJson
tiene variantes en donde puede especificar como parámetro un Flujo de Entrada (Reader) que se asocia a un archivo almacenado en disco que contiene los datos de la colección en formato JSON.