@@ -44,8 +44,8 @@ Si, en cambio, quisiéramos generar una lista de grupos y no un array:
4444
4545.. code-block :: java
4646
47- TypeReference<ArrayList <Grupo > > GrupoLista = new TypeReference<> (){};
48- ArrayList <Grupo > grupos = mapper. readValue(sr, GrupoLista );
47+ TypeReference<List <Grupo > > GrupoLista = new TypeReference<> (){};
48+ List <Grupo > grupos = mapper. readValue(sr, GrupoLista );
4949
5050 .. note :: Que los miembros de cada grupo sean un array o una lista es
5151 absolutamente indiferente: la traducción se hará de igual forma.
@@ -101,6 +101,98 @@ Al escribir, es indiferente si usamos arrays o listas.
101101
102102 String contenido = mapper. writeValueAsString(grupos);
103103
104+ .. _json-jackson-annotations :
105+
106+ Anotaciones
107+ -----------
108+ Hemos visto muy por encima cómo trasladar objetos a |JSON | y viceversa. La regla
109+ es que cada atributo del objeto se traduce en una propiedad |JSON | con el mismo
110+ nombre y que conserva el mismo valor\ [# ]_. Centrémonos en ``Grupo ``:
111+
112+ .. code-block :: java
113+
114+ public class Grupo implements Serializable {
115+
116+ // Atributos
117+ private short nivel;
118+ private String etapa;
119+ private char grupo;
120+ private Tutor tutor;
121+ private Alumno [] miembros;
122+
123+ // Resto de la implementación
124+ }
125+
126+ La serialización de un objeto ``Grupo `` será esta:
127+
128+ .. code-block :: json
129+
130+ {
131+ "nivel" : 1 ,
132+ "etapa" : " ESO" ,
133+ "grupo" : " C" ,
134+ "tutor" : {
135+ // Serialización de un tutor
136+ },
137+ "miembros" : [
138+ // Serialización de los alumnos
139+ ]
140+ }
141+
142+ Ahora bien, ¿cómo puede personalizarse la serialización para cambiar el nombre
143+ de un atributo o no serializarlo? La librería para ello utiliza `anotaciones
144+ <https://www.geeksforgeeks.org/java/annotations-in-java/> `_ que permiten indicar
145+ todos estos particulares:
146+
147+ .. code-block :: java
148+ : emphasize- lines: 6 - 7
149+
150+ public class Grupo implements Serializable {
151+
152+ // Atributos
153+ private short nivel;
154+
155+ @JsonProperty (" etapa_educativa" )
156+ private String etapa;
157+ private char grupo;
158+ private Tutor tutor;
159+ private Alumno [] miembros;
160+
161+ // Resto de la implementación
162+
163+ }
164+
165+ De esta forma logramos que en el |JSON | la propiedad no sea ``etapa ``, sino
166+ ``etapa_educativa ``. Si nuestra intención fuera que algún atributo no pasará al
167+ archivo, tendríamos que anotarlo con ``@JsonIgnore ``. El problema de anotar
168+ directamente la clase es que quizás no nos resulte elegante o directamente no
169+ podamos, porque no dependa de nosotros la definición. Para poder añadir
170+ anotaciones sin modificar la clase original, *Jackson * proporciona un mecanismo:
171+ la mezcla. Para ello podríamos definir aparte otra clase distinta que contenga
172+ exclusivamente los atributos que necesitan anotación:
173+
174+ .. code-block :: java
175+
176+ public abstract class GrupoMixin {
177+
178+ @JsonProperty (" etapa_educativo" )
179+ private String etapa;
180+ }
181+
182+ Luego, al definir el mapeo. se declara que deseamos mezclar la clase original
183+ con la clase abstracta anotada:
184+
185+ .. code-block :: java
186+ : emphasize- lines: 2
187+
188+ ObjectMapper mapper = new ObjectMapper ();
189+ mapper. addMixIn(Grupo . class, GrupoMixin . class);
190+
191+ .. note :: Al :ref:`serializar en formato XML <xml-jackson>` con esta librería,
192+ las anotaciones se vuelven imprescindibles, porque es la única forma de
193+ indicar, entre otras cosas, si un atributo de la clase será un elemento o un
194+ atributo |XML |.
195+
104196.. _json-jackson-no-primitivos :
105197
106198Tipos no primitivos
@@ -154,10 +246,6 @@ y podemos usar dos estrategias:
154246 `jackson-annotations
155247 <https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations> `_.
156248
157- .. note :: Más adelante, al :ref:`tratar XML con esta librería <xml-jackson>`, veremos
158- que tenemos la :ref: `posibilidad de anotar sin necesidad de tocar la clase
159- original <jackson-mixin>`.
160-
161249 .. warning :: Al usar esta anotación puede haber desajustes al serializar las fechas
162250 como consecuencia de la zona horaria, por lo que habría que especificarla
163251 en la propia anotación:
@@ -294,6 +382,10 @@ cada uno de los atributos y hacer lo siguiente:
294382
295383.. rubric :: Notas al pie
296384
385+ .. [# ] Siempre que el tipo, claro está, sea un primitivo de |JSON | (p. ej. una
386+ cadena). Si no lo es entonces habrá que definir cómo realizar la traducción,
387+ cosa que expondremos en :ref: `json-jackson-no-primitivos `.
388+
297389 .. [# ] Es decir, que si se tiene:
298390
299391 .. code-block :: java
@@ -320,4 +412,5 @@ cada uno de los atributos y hacer lo siguiente:
320412 .. |JSON | replace :: :abbr: `JSON ( JavaScript Object Notation ) `
321413.. |Date | replace :: :java-util: `Date <Date> `
322414.. |LocalDate | replace :: :java-time: `LocalDate <LocalDate> `
415+ .. |XML | replace :: :abbr: `XML ( eXtensible Markup Language ) `
323416
0 commit comments