Skip to content

Commit 07f5b2b

Browse files
committed
Actualiza a Jackson 3
1 parent c0090c0 commit 07f5b2b

File tree

11 files changed

+367
-254
lines changed

11 files changed

+367
-254
lines changed

source/02.formatos/02.json/02.jackson.rst

Lines changed: 198 additions & 136 deletions
Large diffs are not rendered by default.

source/02.formatos/03.yaml.rst

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@
55
|YAML| es un superconjunto de |JSON| (véase una :ref:`explicación detallada del
66
formato aquí <lm:yaml>`), por lo que si usamos el `proyecto Jackson
77
<https://github.com/FasterXML/jackson>`_ nos es válido absolutamente todo
8-
:ref:`lo indicado para json <json-jackson>`. Simplemente, tendremos que cargar
8+
:ref:`lo indicado para JSON <json-jackson>`. Simplemente, tendremos que cargar
99
`la librería adecuada
1010
<https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml>`_
1111
y modificar la forma en que definimos el mapeador:
1212

1313
.. code-block:: java
1414
15-
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
15+
YamlFactory factory = YamlFactory.builder()
16+
.build();
17+
18+
MapperBuilder<?, ?> builder = YamlMapper.builder(factory);
19+
20+
ObjectMapper mapper = builder.build();
1621
1722
.. |YAML| replace:: :abbr:`YAML (YAML Ain't Markup Language)`
1823
.. |JSON| replace:: :abbr:`JSON (JavaScript Object Notation)`

source/03.xml/02.jackson.rst

Lines changed: 69 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@ y esta otra ``Profesor``:
2424
:class: toggle
2525
:caption: Profesor.java
2626

27-
.. caution:: Se ha definido el departamento como una cadena por simplificar el
28-
código. En puridad, el departamento debería ser un Enum y, en ese caso,
29-
habría que hacer :ref:`un traductor <json-jackson-no-primitivos>`.
27+
.. note:: Para no complicar en exceso el código se han puesto todos los
28+
atributos como :java-lang:`String`.
3029

3130
.. _xml-jackson-write:
3231

@@ -78,20 +77,20 @@ respecto a |JSON|:
7877
+ En |XML| el orden de los nodos elemento importa y podría ser que nos
7978
interesara predefinirlo.
8079

81-
Teniendo presente esto, podemos alterar las clases anteriores del siguiente
82-
modo:
80+
Teniendo presente esto, escribamos clases abstractas complementarias que
81+
incluyan las anotaciones y que luego mezclaremos:
8382

84-
.. literalinclude:: files/Claustro-xml.java
83+
.. literalinclude:: files/ClaustroMixin.java
8584
:language: java
8685
:class: toggle
87-
:caption: Claustro.java
88-
:emphasize-lines: 1,4,7,8
86+
:caption: ClaustroMixin.java
87+
:emphasize-lines: 1,3,6,7
8988

90-
.. literalinclude:: files/Profesor-xml.java
89+
.. literalinclude:: files/ProfesorMixin.java
9190
:language: java
9291
:class: toggle
93-
:caption: Profesor.java
94-
:emphasize-lines: 3
92+
:caption: ProfesorMixin.java
93+
:emphasize-lines: 2, 5, 8
9594

9695
Hemos utilizados anotaciones sobre las clases para:
9796

@@ -130,6 +129,44 @@ Hemos utilizados anotaciones sobre las clases para:
130129
Por supuesto, la anotación también es válida cuando se genera el formato
131130
|JSON|, pero no suele tener importancia.
132131

132+
.. note:: En este ejemplo tenemos una clase explícita (``Claustro``) que sirve
133+
como envoltorio a una lista de profesores. Obśervese que es en este
134+
envoltorio donde controlamos qué etiquetas se utilizan para los elementos de
135+
la lista. En otro caso distinto en que
136+
tuviéramos solamente una lista (o array) y quisiéramos generar un |XML|,
137+
deberíamos ser conscientes de que en la traducción no podríamos controlar el
138+
elemento padre ni los nombres de las etiquetas de los elementos de la lista.
139+
Es decir, si tuviéramos una lista de objetos ``Profesor`` al generar un |XML|
140+
obtendríamos lo siguiente:
141+
142+
.. code-block:: xml
143+
144+
<Profesor>
145+
<Profesor>
146+
<!-- Contenido del primer profesor... -->
147+
</Profesor>
148+
149+
<!-- Más profesores -->
150+
</Profesor>
151+
152+
Si nuestra intención fuera controlar los nombres de esas etiquetas al
153+
traducir a XML, entonces tendríamos que crear una clase adicional que hiciera
154+
de envoltorio, aunque en nuestro modelo de datos no exista:
155+
156+
.. code-block:: java
157+
158+
@JsonRootName(value = "claustro")
159+
public class ProfesorWrapper {
160+
161+
@JacksonXmlElementWrapper(useWrapping = false)
162+
@JacksonnXmlProperty(localName = "profesor")
163+
private Profesor[] profesores;
164+
}
165+
166+
Por supuesto, antes de escribir el |XML| deberíamos crear un objeto de este
167+
clase envoltorio y asignar al atributo ``profesores`` la lista de profesores
168+
existente.
169+
133170
Por último queda generar la salida en el programa principal, que es básicamente
134171
igual que :ref:`la escritura en el caso de JSON <json-jackson-write>`:
135172

@@ -145,18 +182,24 @@ igual que :ref:`la escritura en el caso de JSON <json-jackson-write>`:
145182
}
146183
);
147184
148-
ObjectMapper mapper = new XmlMapper()
149-
.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true)
150-
.enable(SerializationFeature.INDENT_OUTPUT); // Salida "bonita".
185+
XmlFactory factory = XmLFactory.builder()
186+
.enable(XmlWriteFeature.WRITE_XML_DECLARATION)
187+
.enable(XmlWriteFeature.WRITE_XML_1_1)
188+
.build();
189+
190+
MapperBuilder<?, ?> builder = XmlFactory.builder(factory)
191+
.enable(SerializationFeature.INDENT_OUTPUT)
192+
.addMixIn(Claustro.class, ClaustroMixin.class)
193+
.addMixIn(Profesor.class, ProfesorMixin.class);
194+
195+
ObjectMapper mapper = builder.build();
151196
152197
try (
153198
OutputStream st = Files.newOutputStream(archivo);
154199
OutputStreamWriter sw = new OutputStreamWriter(st);
155-
)
156-
{
200+
) {
157201
mapper.writeValue(sw, claustro);
158-
}
159-
catch(IOException err) {
202+
} catch(IOException err) {
160203
err.printStackTrace();
161204
}
162205
@@ -168,8 +211,7 @@ También podríamos haber generado una cadena con la salida:
168211
try {
169212
String contenido = mapper.writeValueAsString(claustro);
170213
System.out.println(contenido);
171-
}
172-
catch(IOException err) {
214+
} catch(IOException err) {
173215
err.printStackTrace();
174216
}
175217
@@ -189,19 +231,22 @@ Habiendo definido las clases con anotaciones como en el apartado anterior, la
189231
lectura del formato es :ref:`prácticamente la misma que para JSON <json-jackson-read>`:
190232

191233
.. code-block:: java
192-
:emphasize-lines: 2
193234
194235
Path archivo = Path.of(System.getProperty("user.home"), "claustro.xml");
195-
ObjectMapper mapper = new XmlMapper();
236+
237+
MapperBuilder<?, ?> builder = XmlFactory.builder()
238+
.addMixIn(Claustro.class, ClaustroMixin.class)
239+
.addMixIn(Profesor.class, ProfesorMixin.class);
240+
241+
ObjectMapper mapper = builder.build();
196242
197243
try (
198244
InputStream st = Files.newInputStream(ruta);
199245
InputStreamReader sr = new InputStreamReader(st);
200246
) {
201247
Claustro claustro = mapper.readValue(sr, Claustro.class);
202248
System.out.println(claustro);
203-
}
204-
catch(IOException err) {
249+
} catch(IOException err) {
205250
err.printStackTrace();
206251
}
207252

source/03.xml/files/Claustro-xml.java

Lines changed: 0 additions & 26 deletions
This file was deleted.

source/03.xml/files/Claustro.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,21 @@ public Claustro(String centro, Profesor[] plantilla) {
1010
setPlantilla(plantilla);
1111
}
1212

13-
public String getCentro() { return centro; }
14-
public void setCentro(String centro) { this.centro = centro; }
15-
public Profesor[] getPlantilla() { return plantilla; }
16-
public void setPlantilla(Profesor[] plantilla) { this.plantilla = plantilla; }
13+
public String getCentro() {
14+
return centro;
15+
}
16+
17+
public void setCentro(String centro) {
18+
this.centro = centro;
19+
}
20+
21+
public Profesor[] getPlantilla() {
22+
return plantilla;
23+
}
24+
25+
public void setPlantilla(Profesor[] plantilla) {
26+
this.plantilla = plantilla;
27+
}
1728

1829
public String toString() {
1930
return String.format("%s -- %s", centro, Arrays.toString(plantilla));
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
@JsonRootName(value = "claustro")
2+
public class ClaustroMixin {
3+
@JacksonXmlProperty(isAttribute = true)
4+
private String centro;
5+
6+
@JacksonXmlElementWrapper(useWrapping = false)
7+
@JacksonXmlProperty(localName = "profesor")
8+
private Profesor[] plantilla;
9+
}

source/03.xml/files/Profesor-xml.java

Lines changed: 0 additions & 46 deletions
This file was deleted.

source/03.xml/files/Profesor.java

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ public class Profesor {
1111

1212
public Profesor() {}
1313

14-
// Deberíamos tratar "casillero" y "sustituye"...
1514
public Profesor(String id, String apelativo, String nombre, String apellidos, String departamento, String nacimiento) {
1615
setId(id);
1716
setApelativo(apelativo);
@@ -20,20 +19,59 @@ public Profesor(String id, String apelativo, String nombre, String apellidos, St
2019
setDepartamento(departamento);
2120
}
2221

23-
public String getId() { return id; }
24-
public void setId(String id) { this.id = id; }
25-
public String getSustituye() { return sustituye; }
26-
public void setSustituye(String sustituye) { this.sustituye = sustituye; }
27-
public String getCasillero() { return casillero; }
28-
public void setCasillero(String casillero) { this.casillero = casillero; }
29-
public String getApelativo() { return apelativo; }
30-
public void setApelativo(String apelativo) { this.apelativo = apelativo; }
31-
public String getNombre() { return nombre; }
32-
public void setNombre(String nombre) { this.nombre = nombre; }
33-
public String getApellidos() { return apellidos; }
34-
public void setApellidos(String apellidos) { this.apellidos = apellidos; }
35-
public String getDepartamento() { return departamento; }
36-
public void setDepartamento(String departamento) { this.departamento = departamento; }
22+
public String getId() {
23+
return id;
24+
}
25+
26+
public void setId(String id) {
27+
this.id = id;
28+
}
29+
30+
public String getSustituye() {
31+
return sustituye;
32+
}
33+
34+
public void setSustituye(String sustituye) {
35+
this.sustituye = sustituye;
36+
}
37+
38+
public String getCasillero() {
39+
return casillero;
40+
}
41+
42+
public void setCasillero(String casillero) {
43+
this.casillero = casillero;
44+
}
45+
46+
public String getApelativo() {
47+
return apelativo;
48+
}
49+
public void setApelativo(String apelativo) {
50+
this.apelativo = apelativo;
51+
}
52+
public String getNombre() {
53+
return nombre;
54+
}
55+
56+
public void setNombre(String nombre) {
57+
this.nombre = nombre;
58+
}
59+
60+
public String getApellidos() {
61+
return apellidos;
62+
}
63+
64+
public void setApellidos(String apellidos) {
65+
this.apellidos = apellidos;
66+
}
67+
68+
public String getDepartamento() {
69+
return departamento;
70+
}
71+
72+
public void setDepartamento(String departamento) {
73+
this.departamento = departamento;
74+
}
3775

3876
public String toString() {
3977
return String.format("%s, %s [%s] (%s)", apellidos, nombre, id, departamento);
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
public abstract class ProfesorMixin {
2+
@JacksonXmlProperty(isAttribute = true)
3+
private String id;
4+
5+
@JacksonXmlProperty(isAttribute = true)
6+
private String sustituye;
7+
8+
@JacksonXmlProperty(isAttribute = true)
9+
private String casillero;
10+
}

source/99.ejercicios/01.archivos.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ Archivos
4040
+ Fecha de nacimiento.
4141
+ Estudios previos (Sin estudios, Primaria, Secundaria, Bachillerato, FP, Universidad).
4242

43+
Haga una interfaz interactiva y otra que tome datos incluidos en el propio
44+
código.
45+
4346
b. Guarde la lista de estudiantes en un archivo.
4447
c. Recupere el archivo y compruebe que la lista recuperada es igual a la
4548
lista original. Para esto último, implemente un método ``equals`` que

0 commit comments

Comments
 (0)