2015-09-04 14 views
9

Ho un'entità che contiene la raccolta come attributo:Jackson deserializzatore - cambiare raccolta nulla per svuotare una

public class Entity { 

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

} 

Se la richiesta contiene nulla come richiesta di proprietà:

{ 
    "homes": null 
} 

poi case è impostato su NULL . Quello che voglio fare è impostare le case sulla lista vuota. Devo scrivere un deserializzatore speciale per questo o ce n'è uno per le raccolte? Quello che ho provato è questo deserializzatore ma sembra brutto (non è generico e utilizza l'implementazione anziché l'interfaccia).

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(); 
    } 
} 

Così alcune domande:

  1. c'è qualche proprietà Jackson che cambia nulla alla raccolta vuota durante la deserializzazione?
  2. Se no per il primo punto, è necessario scrivere deserializzatore per questo? Se sì, posso scriverne uno generico?

risposta

5

Inoltre, non ho trovato alcuna proprietà o annotazione di Jackson per questo. Quindi dovrò rispondere no alla prima domanda. Ma mi sento di raccomandare un semplice setter al posto del deserializer speciale:

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; 
    } 
} 

Questo è generico in quanto utilizza solo l'interfaccia invece di HomeImplHome. Non è necessario @JsonProperty poiché Jackson associerà setHomes e homes.

0

Ciò che ha funzionato per me è stato semplicemente rimuovere il setter e rendere definitivo l'attributo. jackson 2 utilizzerà quindi il getter per modificare l'elenco.

public class Entity { 

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

    public List<Home> getHomes() { 
    return homes; 
    } 
} 

La funzione di responsabile è USE_GETTERS_AS_SETTERS che è attivata per impostazione predefinita: https://github.com/FasterXML/jackson-databind/wiki/Mapper-Features