Jersey + Jackson在反序列化时删除null

时间:2016-09-22 21:38:03

标签: jackson deserialization jersey-2.0

在我的项目中,我使用Jersey 2.23.1和Jackson进行JSON支持。

当我收到像{“foo”:null,“bar”:“123”}之类的请求作为JSON时,与A类匹配{String foo;字符串栏;} Jersey首先创建A的实例和A的实例(如果在构造函数中指定,则使用默认值),然后将JSON反序列化为临时对象A',然后将JSON中指定的所有JSON字段从A'复制到A.如果我有在A类构造函数中的默认值,并且在JSON中字段等于null,我的所有默认值都被删除并替换为null(所以在我之前的示例中,如果我有“foo”字段的默认值,它将被替换在对象中,null将返回作为我的@Path annoted方法的参数。

我在A类上使用@JsonInclude(Include.NON_NULL)以避免在Response期间传输null fileds。但它只适用于序列化,反序列化呢?我的意思是,当有{“foo”:null}时,因为JSON在反序列化后导致新对象实例中的字段“foo”= null。

这里有一些代码来总结所有这些:`

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(value = Include.NON_NULL)
public class User {
    public enum EUserRole {
        PARENT, STUDENT, PROF, ADMIN
    }

    @Id
    public String id;
    public String firstName;
    public String lastName;
    public EUserRole role;

    public User() {
         id = ObjectId.get().toString();
         role = EUserRole.STUDENT;
         lastName = "RandomLastName";
    }
}

` 如果我通过这种JSON

{ "id":null, "lastName":null, "firstName":"Random First Name", "role":"STUDENT" }

到我的方法(在控制器中)

@POST public Response createUser(final User entity) { }

它导致JSON中的所有空字段在我的实体中设置为null,而不是设置为构造函数的默认值。

您知道是否有办法在反序列化期间指定Jackson忽略空字段?或者这是与泽西相关的行为?

干杯,

1 个答案:

答案 0 :(得分:0)

根据包含的值,无法忽略JSON有效负载中的数据(您可以使用ignoral忽略给定属性的所有值)。 因此,如果要避免空赋值,则需要定义一个只会吞下null值的setter(即,只赋值为null)。

阻止null分配的功能可能是通过@JsonFormat.Feature添加的有用功能,例如:

// hypothetical no such feature exists yes
@JsonFormat(without = JsonFormat.Feature.ALLOW_NULL_ASSIGNMENT)

所以也许这可能是一个功能请求。

我认为这属于每个属性处理的原因是,这似乎是某些属性的特定规则。如果看起来用户真的喜欢这种无效的话,也许也可能存在匹配的全局设置。