在我的项目中,我使用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忽略空字段?或者这是与泽西相关的行为?
干杯,
答案 0 :(得分:0)
根据包含的值,无法忽略JSON有效负载中的数据(您可以使用ignoral忽略给定属性的所有值)。
因此,如果要避免空赋值,则需要定义一个只会吞下null
值的setter(即,只赋值为null)。
阻止null
分配的功能可能是通过@JsonFormat.Feature
添加的有用功能,例如:
// hypothetical no such feature exists yes
@JsonFormat(without = JsonFormat.Feature.ALLOW_NULL_ASSIGNMENT)
所以也许这可能是一个功能请求。
我认为这属于每个属性处理的原因是,这似乎是某些属性的特定规则。如果看起来用户真的喜欢这种无效的话,也许也可能存在匹配的全局设置。