tutorial property name jsonproperty example annotation java json jackson deserialization

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.



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.