2015-09-04 10 views
9

Mam podmiot, który zawiera kolekcję jako atrybut:Jackson Deserializator - zmień zerowy kolekcji opróżnić jeden

public class Entity { 

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

} 

Jeżeli wniosek zawiera null jako Nieruchomości:

{ 
    "homes": null 
} 

następnie domów jest ustawiona na null . Co chcę zrobić, to ustawić domy na pustą listę. Czy muszę napisać specjalny deserializator dla tego lub czy istnieje jeden dla kolekcji? To, co próbowałem, to deserializator, ale wygląda na brzydki (nie jest generyczny i używa implementacji zamiast interfejsu).

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

więc kilka pytań:

  1. Czy istnieje jakiś mieście Jackson, który zmienia wartość null do pustej kolekcji podczas deserializacji?
  2. Jeśli nie dla pierwszego punktu - czy muszę w tym celu napisać deserializer? Jeśli tak, czy mogę napisać rodzajowy?

Odpowiedz

5

Nie mogłem również znaleźć ani właściwości Jacksona, ani adnotacji. Więc na pierwsze pytanie będę musiał odpowiedzieć "nie". Ale polecam prostą setter zamiast specjalnego Deserializatora:

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

To jest ogólny, gdyż tylko wykorzystuje interfejs zamiast HomeImplHome. Nie potrzebujesz @JsonProperty, ponieważ Jackson będzie kojarzył setHomes i homes.

0

To, co dla mnie zadziałało, polegało po prostu na usunięciu setera i ostatecznemu określeniu atrybutu. jackson 2 następnie użyje gettera do zmodyfikowania listy.

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

odpowiedzialna funkcja jest USE_GETTERS_AS_SETTERS która jest domyślnie włączona: https://github.com/FasterXML/jackson-databind/wiki/Mapper-Features