2015-09-04 22 views
9

を空にNULLのコレクションを変更します。ジャクソンデシリアライザ - 私は属性としてコレクションを含むエンティティを持っている1

public class Entity { 

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

} 

を要求は、要求特性としてnullが含まれている場合:

{ 
    "homes": null 
} 

その後、家がnullに設定されています。私がしたいことは、家を空リストにすることです。このために特別なデシリアライザを作成する必要がありますか、コレクション用のデシリアライザがありますか?私が試みたのはこのデシリアライザですが、見た目は醜いです(一般的ではなく、インターフェイスの代わりに実装を使用しています)。

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

だから、いくつかの質問:

  1. 直列化復元時に空のコレクションにヌルを変更するいくつかのジャクソンのプロパティがありますか?
  2. 最初のポイントのためのいいえの場合 - 私はこのためにデシリアライザを書くために必要なのですか?はいの場合は、一般的なものを書くことはできますか?

答えて

5

また、私は、このためにジャクソンのプロパティや注釈を見つけることができませんでした。だから私は最初の質問には答えなくてはならない。しかし、私は特別なデシリアライザの代わりに、単純なセッターをお勧めします:それは唯一の代わりにHomeImplHomeインタフェースを使用して

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

これは一般的なもので。ジャクソンはsetHomeshomesを関連付けますようあなたは@JsonProperty必要はありません。私の仕事は何

0

はセッターを削除し、属性の最終を作るために、単純でした。 jackson 2はゲッターを使用してリストを変更します。 https://github.com/FasterXML/jackson-databind/wiki/Mapper-Features

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

責任機能はデフォルトでオンになってUSE_GETTERS_AS_SETTERSです

関連する問題