Skip to content

Commit 779917e

Browse files
committed
Intercambia el orden de los epígrafes dedicados a GSON y Jackson
1 parent 7adf346 commit 779917e

File tree

6 files changed

+67
-67
lines changed

6 files changed

+67
-67
lines changed
Lines changed: 55 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,40 @@
22

33
Jackson
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

2549
Lectura
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

5886
Escritura
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>`
Lines changed: 8 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -16,42 +16,17 @@ por *Google* y nos permite dos estrategias para leer y escribir |JSON|:
1616
:java-time:`LocalDate <LocalDate>`. El texto bajo este epígrafe necesita un
1717
repaso.
1818

19+
para lo cual podemos definir las clases para
20+
21+
:ref:`la misma forma <gson-auto>`.
22+
1923
.. _gson-auto:
2024

2125
Conversión automática
2226
=====================
23-
Para ello necesitamos que las clases con las que vamos a convertir los objetos
24-
codificados en |JSON| sigan el estándar `JavaBean
25-
<https://es.wikipedia.org/wiki/JavaBean>`_.
26-
27-
Es obvio que en el ejemplo anterior tenemos tres objetos (`Grupo`, `Alumno` y
28-
`Tutor`) así que definámoslos, de modo que sus atributos se ajusten a lo que
29-
recoge el |JSON|:
30-
31-
.. literalinclude:: files/Tutor.java
32-
:class: toggle
33-
:name: class-tutor
34-
:caption: Tutor.java
35-
36-
.. literalinclude:: files/Alumno.java
37-
:class: toggle
38-
:name: class-alumno
39-
:caption: Alumno.java
40-
41-
.. literalinclude:: files/Grupo.java
42-
:class: toggle
43-
:name: class-grupo
44-
:caption: Grupo.java
45-
46-
No nos hemos roto mucho la cabeza: estas tres clases recogen las propiedades que
47-
se observan en el |JSON| y cumplen los requisitos para ser un *JavaBean*:
48-
49-
.. rst-class:: simple
50-
51-
* Disponen de un constructor sin argumentos.
52-
* Es serializable.
53-
* Sus atributos son privados.
54-
* Dispone de *getters* y *setters* con la convención de nombres apropiada.
27+
Tomemos como ejemplo ilustrativo las clases ya usadas al tratar
28+
:ref:`json-jackson`: :ref:`Tutor <class-tutor>`, |Alumno| y :ref:`Grupo
29+
<class-grupo>`.
5530

5631
Lectura
5732
-------
@@ -259,11 +234,8 @@ Conversión manual
259234

260235
.. Enlaces:
261236
https://stackoverflow.com/questions/4308554/simplest-way-to-read-json-from-a-url-in-java
262-
263-
https://www.javadoc.io/doc/com.google.code.gson/gson/latest/com.google.gson/com/google/gson/package-summary.html
264-
265237
https://mkyong.com/java/how-do-convert-java-object-to-from-json-format-gson-api/
266238
267239
268240
.. |JSON| replace:: :abbr:`JSON (JavaScript Object Notation)`
269-
241+
.. |Alumno| replace:: :ref:`Alumno <class-alumno>`

source/02.formatos/02.json/files/Alumno.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
import java.io.Serializable;
2-
3-
public class Alumno implements Serializable {
1+
public class Alumno {
42
private String nombre;
53
private LocalDate fechaNacimiento;
64

source/02.formatos/02.json/files/Grupo-etapa.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import java.io.Serializable;
21
import java.util.Arrays;
32

4-
public class Grupo implements Serializable {
3+
public class Grupo {
54
private short nivel;
65
private Etapa etapa;
76
private char grupo;

source/02.formatos/02.json/files/Grupo.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import java.io.Serializable;
21
import java.util.Arrays;
32

4-
public class Grupo implements Serializable {
3+
public class Grupo {
54
private short nivel;
65
private String etapa;
76
private char grupo;

source/02.formatos/02.json/files/Tutor.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
import java.io.Serializable;
2-
3-
public class Tutor implements Serializable {
1+
public class Tutor {
42
private String nombre;
53
private String especialidad;
64

0 commit comments

Comments
 (0)