serialize jsonserialize jsondeserialize deserializer java json jackson

java - jsonserialize - Deserializador de Jackson: cambie la colección nula para vaciar uno



jsonserializer jackson (1)

Tengo una entidad que contiene la colección como atributo:

public class Entity { @JsonProperty(value="homes") @JsonDeserialize(as=HashSet.class, contentAs=HomeImpl.class) private Collection<Home> homes = new ArrayList<Home>(); }

Si la solicitud contiene nulo como propiedad de solicitud:

{ "homes": null }

entonces las casas están configuradas como nulas. Lo que quiero hacer es establecer hogares en la lista vacía. ¿Debo escribir un deserializador especial para esto o hay uno para colecciones? Lo que probé es este deserializador, pero se ve feo (no es genérico y usa implementación en lugar de interfaz).

public class NotNullCollectionDeserializer extends JsonDeserializer<Collection<HomeImpl>> { @Override public Collection<HomeImpl> deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException { return jsonParser.readValueAs(new TypeReference<Collection<HomeImpl>>(){}); } @Override public Collection<HomeImpl> getNullValue() { return Collections.emptyList(); } }

Muy pocas preguntas:

  1. ¿Hay alguna propiedad de jackson que cambie null a la colección vacía durante la deserialización?
  2. Si no es por el primer punto, ¿necesito escribir un deserializador para esto? Si es así, ¿puedo escribir uno genérico?

Tampoco pude encontrar una propiedad o anotación de Jackson para esto. Así que tendré que responder no a la primera pregunta. Pero recomendaría un setter simple en lugar del deserializador especial:

public class Entity { @JsonDeserialize(contentAs = HomeImpl.class) private Collection<Home> homes = new ArrayList<>(); public void setHomes(List<Home> homes) { if (homes != null) this.homes = homes; } }

Esto es genérico ya que solo usa la interfaz de Home en lugar de HomeImpl . No necesita @JsonProperty ya que Jackson asociará setHomes y homes .