我有一个包含集合作为属性的实体:
public class Entity { @JsonProperty(value="homes") @JsonDeserialize(as=HashSet.class, contentAs=HomeImpl.class) private Collection<Home> homes = new ArrayList<Home>(); }
如果请求包含null作为请求属性:
{ "homes": null }
然后将homes设置为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(); } }
这么几个问题:
我也找不到为此的Jackson属性或注释。因此,我必须对第一个问题回答“否”。但是我建议使用一个简单的setter而不是特殊的反序列化器:
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; } }
这是通用的,因为它仅使用Home接口而不是HomeImpl。你不需要@JsonProperty因为杰克逊将关联setHomes和homes。
Home
HomeImpl
@JsonProperty
setHomes
homes