2015-09-04 69 views
9

我有一个包含集合作为属性的实体:杰克逊解串器 - 改变空的集合空单

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

我也无法找到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将联系setHomeshomes

0

对我而言,只是简单地删除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