java - property - ¿Cuál es el equivalente de deserialización de Jackson de @JsonUnwrapped?
java jackson tutorial (3)
Digamos que tengo la siguiente clase:
public class Parent {
public int age;
@JsonUnwrapped
public Name name;
}
Produciendo JSON:
{
"age" : 18,
"first" : "Joey",
"last" : "Sixpack"
}
¿Cómo deserializo esto nuevamente en la clase de Padres? Podría usar @JsonCreator
@JsonCreator
public Parent(Map<String,String> jsonMap) {
age = jsonMap.get("age");
name = new Name(jsonMap.get("first"), jsonMap.get("last"));
}
Pero esto también agrega efectivamente @JsonIgnoreProperties(ignoreUnknown=true)
a la clase Parent, ya que todas las propiedades se asignan aquí. Por lo tanto, si desea que los campos JSON desconocidos arrojen una excepción, debe hacerlo usted mismo. Además, si los valores del mapa pueden ser algo distinto a Strings, tendrá que hacer algunas comprobaciones y conversiones manuales. ¿Hay alguna manera de que Jackson maneje este caso automáticamente?
Editar: podría estar loco, pero en realidad parece funcionar a pesar de que nunca se menciona explícitamente en la documentación: http://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonUnwrapped.html
Estaba bastante seguro de que no funcionó para mí previamente. Aún así, el enfoque propuesto de @JsonCreator podría preferirse cuando se requiere una lógica personalizada para deserializar los tipos polimórficos desenvueltos.
Funciona también para la deserialización, aunque no se menciona explícitamente en los documentos, como usted dijo. Consulte la prueba unitaria para la deserialización de @JsonUnwrapped
aquí para confirmación - https://github.com/FasterXML/jackson-databind/blob/d2c083a6220f2875c97c29f4823d9818972511dc/src/test/java/com/fasterxml/jackson/databind/struct/TestUnwrapped.java#L138
Para aquellos que buscaron en Google aquí como yo, tratando de resolver el problema cuando deserializaron el Map
no comprometido, hay una solución con @JsonAnySetter
:
public class CountryList
{
Map<String, Country> countries = new HashMap<>();
@JsonAnySetter
public void setCountry(String key, Country value)
{
countries.put(key, value);
}
}
Puede usar @JsonCreator
con @JsonProperty
para cada campo:
@JsonCreator
public Parent(@JsonProperty("age") Integer age, @JsonProperty("firstName") String firstName,
@JsonProperty("lastName") String lastName) {
this.age = age;
this.name = new Name(firstName, lastName);
}
En este caso, Jackson realiza un chequeo de campo y un campo desconocido.