一尘不染

杰克逊解串器-将null集合更改为空

json

我有一个包含集合作为属性的实体:

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

这么几个问题:

  1. 是否有一些杰克逊属性在反序列化期间将null更改为空集合?
  2. 如果第一点没有,那么我需要为此写反序列化器吗?如果可以,我可以写一个通用的吗?

阅读 216

收藏
2020-07-27

共1个答案

一尘不染

我也找不到为此的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因为杰克逊将关联setHomeshomes

2020-07-27