杰克逊解串器 - 改变空的集合空单
问题描述:
我有一个包含集合作为属性的实体:杰克逊解串器 - 改变空的集合空单
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();
}
}
这么几个问题:
- 是否有反序列化期间改变空空收集一些杰克逊的财产?
- 如果第一点没有 - 我是否需要为此编写反序列化器?如果是的话,我可以写通用的吗?
答
我也无法找到Jackson属性或注释。所以我必须回答第一个问题。但我会建议一个简单的二传手,而不是特殊的解串器:
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
,因为Jackson将联系setHomes
和homes
。
答
对我而言,只是简单地删除setter并使属性成为final。杰克逊2然后将使用getter修改列表。
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:https://github.com/FasterXML/jackson-databind/wiki/Mapper-Features