22
33Jackson
44*******
5- Otra librería muy utilizada y que tiene la ventaja de que también soporta
6- :ref: `XML <xml >` es la proporcionada por el `proyecto Jackson
7- <https://github.com/FasterXML/jackson> `_.
5+ Un potentísima librería, que tiene la ventaja de que también soporta :ref: `XML
6+ <xml>` es la proporcionada por el `proyecto Jackson
7+ <https://github.com/FasterXML/jackson> `_, disponible en su `repositorio de
8+ mvnrepository.com
9+ <https://mvnrepository.com/artifact/tools.jackson.core/jackson-databind> `_\ [# ]_.
810
9- Como :ref: `GSON <json-gson >`, nos permite hacer una conversión automática entre
10- el modelo de objetos y |JSON | para lo cual podemos definir las clases para
11- :ref: `Tutor <class-tutor >`, |Alumno | y :ref: `Grupo <class-grupo >` exactamente de
12- :ref: `la misma forma <gson-auto >`. En este caso, la librería que necesitamos es
13- `jackson-databind
14- <https://mvnrepository.com/artifact/tools.jackson.core/jackson-databind> `_.
11+ Permite hacer una conversión automática entre el modelo de objetos y |JSON |.
12+ Para ilustrarlo, podemos definir las tres clases que modelas el :ref: `archivo
13+ json propuesto <grupos.json>`:
14+
15+ .. literalinclude :: files/Tutor.java
16+ :class: toggle
17+ :name: class-tutor
18+ :caption: Tutor.java
19+
20+ .. literalinclude :: files/Alumno.java
21+ :class: toggle
22+ :name: class-alumno
23+ :caption: Alumno.java
24+
25+ .. literalinclude :: files/Grupo.java
26+ :class: toggle
27+ :name: class-grupo
28+ :caption: Grupo.java
29+
30+ No nos hemos roto mucho la cabeza: estas tres clases recogen las propiedades que
31+ se observan en el |JSON | y, además, cumplen los requisitos para ser un
32+ *JavaBean *, aunque no es indispensable:
33+
34+ .. rst-class :: simple
35+
36+ * Disponen de un constructor sin argumentos.
37+ * Sus atributos son privados.
38+ * Dispone de *getters * y *setters * con la convención de nombres apropiada.
1539
1640.. _json-jackson-basico :
1741
@@ -24,7 +48,8 @@ Empecemos por ver cómo leer o escribir :ref:`el archivo JSON de referencia
2448
2549Lectura
2650-------
27- El código es muy similar al practicado con `GSON `:
51+ Básicamente, necesitamos un *mapper * y volcar los datos en el almacenamiento que
52+ hayamos decidido:
2853
2954.. code-block :: java
3055 : emphasize- lines: 2 , 5
@@ -40,15 +65,18 @@ El código es muy similar al practicado con `GSON`:
4065 err. printStackTrace();
4166 }
4267
43- Si, en cambio, quisiéramos generar una lista de grupos y no un array:
68+ Obsérvese que necesitamos indicar en qué objeto de *Java * se convertirán los
69+ datos. Cuando es un objeto único es bien sencillo (``LaClaseDelObjeto.class ``) y
70+ en el caso de arrays, también. Pero cuando tenemos colecciones de datos basadas
71+ en genéricos debemos recurrir a |TypeReference |:
4472
4573.. code-block :: java
4674
4775 TypeReference<List<Grupo > > GrupoLista = new TypeReference<> (){};
4876 List<Grupo > grupos = mapper. readValue(sr, GrupoLista );
4977
5078 .. note :: Cuando los atributos de clases incluidas en la traducción
51- son secuencias, es indiferente que sea listas o array : la traducción
79+ son secuencias, es indiferente que sea listas o * arrays * : la traducción
5280 se lleva a cabo de igual forma. En nuestro ejemplo, es el caso del atributo
5381 ``miembros `` de :ref: `Grupo <class-grupo >`, que lo hemos definido como un
5482 *array *, pero podría perfectamente ser una lista.
@@ -57,8 +85,7 @@ Si, en cambio, quisiéramos generar una lista de grupos y no un array:
5785
5886Escritura
5987---------
60- Por su parte la escritura a un |JSON | desde un modelo de objetos tampoco tiene
61- excesivas diferencias respecto a lo que encontraríamos en `GSON `:
88+ Por su parte la escritura a un |JSON | tampoco es excesivamente complicada:
6289
6390.. code-block :: java
6491 : emphasize- lines: 27 , 30
@@ -99,9 +126,11 @@ excesivas diferencias respecto a lo que encontraríamos en `GSON`:
99126 }
100127 }
101128
102- Al escribir, es indiferente si usamos arrays o listas.
129+ Como se ve el método que realiza la escritura al formato recibe los datos, de
130+ los cuales puede deducir el tipo y, por consiguiente, no tiene relevancia si
131+ volcamos un objeto o una secuencia de la naturaleza que sea.
103132
104- .. note :: Existe el método ``writeValueAsString`` que devuelve una cadena con el
133+ .. tip :: Existe el método ``writeValueAsString`` que devuelve una cadena con el
105134 |JSON | resultante:
106135
107136 .. code-block :: java
@@ -216,7 +245,7 @@ nombre y que conserva el mismo valor\ [#]_. Centrémonos en |Alumno|:
216245
217246.. code-block :: java
218247
219- public class Alumno implements Serializable {
248+ public class Alumno {
220249
221250 // Atributos
222251 private String nombre;
@@ -242,7 +271,7 @@ todos estos particulares:
242271.. code-block :: java
243272 : emphasize- lines: 6 , 11
244273
245- public class Alumno implements Serializable {
274+ public class Alumno {
246275
247276 // Atributos
248277 private String nombre;
@@ -528,7 +557,7 @@ más información referente a los alumnos:
528557.. code-block :: java
529558 : emphasize- lines: 4 , 5
530559
531- public class Alumno implements Serializable {
560+ public class Alumno {
532561 private String nombre;
533562 private LocalDate fechaNacimiento;
534563 private int telefono;
@@ -551,7 +580,7 @@ atributo:
551580.. code-block :: java
552581 : emphasize- lines: 2 , 8 , 11
553582
554- public class Alumno implements Serializable {
583+ public class Alumno {
555584 @JsonView (Views . Public . class)
556585 private String nombre;
557586
@@ -601,6 +630,10 @@ El otro mecanismo para filtrar atributos es usar **filtros**:
601630
602631 .. rubric :: Notas al pie
603632
633+ .. [# ] La librería se descompone en varias con `jackson-databind
634+ <https://mvnrepository.com/artifact/tools.jackson.core/jackson-databind> `_
635+ tendremos soporte básico para |JSON |, que es el formato base.
636+
604637 .. [# ] Siempre que el tipo, claro está, sea un primitivo de |JSON | (p. ej. una
605638 cadena). Si no lo es entonces habrá que definir cómo realizar la traducción,
606639 cosa que expondremos en :ref: `json-jackson-no-primitivos `.
@@ -632,6 +665,7 @@ El otro mecanismo para filtrar atributos es usar **filtros**:
632665.. |YAML | replace :: :abbr: `YAML ( YAML Ain't Markup Language ) `
633666.. |DTO | replace :: :abbr: `DTO ( Data Transfer Object ) `
634667
668+ .. |Alumno | replace :: :ref: `Alumno <class-alumno >`
635669.. |JsonMapper | replace :: :jackson-databind: `JsonMapper <json/JsonMapper> `
636670.. |JsonFactory | replace :: :jackson-core: `JsonFactory <json/JsonFactory> `
637671.. |JsonMapper.Builder | replace :: :jackson-databind: `JsonMapper.Builder <json/JsonMapper.Builder> `
@@ -641,7 +675,7 @@ El otro mecanismo para filtrar atributos es usar **filtros**:
641675.. |DeserializationFeature | replace :: :jackson-databind: `DeserializationFeature `
642676.. |MapperBuilder | replace :: :jackson-databind: `MapperBuilder <cfg/MapperBuilder> `
643677.. |ObjectMapper | replace :: :jackson-databind: `ObjectMapper `
644- .. |Alumno | replace :: :ref: `Alumno <class-alumno >`
645678.. |LocalDateSerializer | replace :: :jackson-databind: `LocalDateSerializer <ext/javatime/ser/LocalDateSerializer> `
646679.. |LocalDateDeserializer | replace :: :jackson-databind: `LocalDateDeserializer <ext/javatime/deser/LocalDateDeserializer> `
647680.. |ObjectWriter | replace :: :jackson-databind: `ObjectWriter <ObjectWriter> `
681+ .. |TypeReference | replace :: :jackson-core: `TypeReference <type/TypeReference> `
0 commit comments