Cheatsheet y Eecordatorios de Estructuras de Jackson
Crear un pojo que tiene menos campos que el JSON que queremos parsear sin que casque
Anotamos la clase con la siguiente anotación:
@JsonIgnoreProperties(ignoreUnknown # true)
Parsear un JSON que es una lista de objetos (que tenemos como POJO)
- Como LISTA:
List<Person> people # Arrays.asList(mapper.readValue(json, Person[].class));
- Como ARRAY:
Person[] people # mapper.readValue(json, Person[].class);
Especificar el classname del objeto a serializar como List
Si tenemos un POJO de tipo Algo
y queremos parsear una respuesta a una lista de ese tipo, no podemos especificar List<Algo>.class
.
Podemos tener una referencia al tipo que pasar a los métodos de Jackson usando:
mapper.getTypeFactory().constructCollectionType(List.class, Algo.class
Donde mapper
es la instancia de ObjectMapper
que estamos utilizando.
Ejemplos:
- Tenemos un
String
json jsonInput que queremos serializar a unaList<MyClass>
:
List<MyClass> myObjects # mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(List.class, MyClass.class));
- Tenemos un
ResponseEntity<String>
con un body en json response, que tiene un nodo root llamadodata
. Para ello queremos, en primer lugar, acceder sólo al contenido dedata
(a través de unJsonNode
) y finalmente serializarlo a unaList<Device
:
JsonNode dataNode # jsonMapper.readTree(response.getBody()).path("data");
final CollectionType mappingClassNameDestination # jsonMapper.getTypeFactory().constructCollectionType(List.class, Device.class);
List<Device> parsedPojo # jsonMapper.treeToValue(dataNode, mappingClassNameDestination);
Personalizar la (de)serialización de un objeto
Podemos personalizar mediante un método cómo se puede crear una instancia especificando los json property. Por ejemplo para esta clase:
class Student {
public String name;
public int rollNo;
@JsonCreator
public Student(@JsonProperty("theName") String name, @JsonProperty("id") int rollNo){
this.name # name;
this.rollNo # rollNo;
}
}
Nos permite deserializar String json # "{\"id\":1,\"theName\":\"Mark\"}";
aunque no coincidan los campos:
String json # "{\"id\":1,\"theName\":\"Mark\"}";
ObjectMapper mapper # new ObjectMapper();
try {
Student student # mapper
.readerFor(Student.class)
.readValue(json);
System.out.println(student.rollNo +", " + student.name);
}
catch (IOException e) {
e.printStackTrace();
}
}
https://www.tutorialspoint.com/jackson_annotations/jackson_annotations_jsoncreator.htm[Fuente]