【发布时间】:2017-01-31 15:15:26
【问题描述】:
在我的项目中,我使用带有 Jackson 的 Jersey 2.23.1 来支持 JSON。
当我收到类似{ "foo":null, "bar":"123" } 作为 JSON 的请求时,匹配 class A{String foo; String bar;} Jersey 首先创建 A 的实例(如果在构造函数中指定,则使用默认值),然后将 JSON 反序列化为临时对象 A' ,然后将 JSON 中指定的所有 JSON 字段从 A' 复制到 A。如果我在 A 类构造函数中具有默认值,并且在 JSON 中具有等于 null 的字段,则我的所有默认值都将被删除并替换为 null。所以在上面的例子中,如果我有一个 foo 字段的默认值,它将被替换为 null 在对象 Jersey 将作为我的 @Path 注释方法的参数返回。
我在A 类上使用@JsonInclude(Include.NON_NULL) 以避免在响应期间传输空字段。但它只适用于序列化,反序列化呢?我的意思是,当将 { "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 中的所有空字段在我的实体中都设置为空,而不是设置为构造函数默认值。
您知道是否有办法指定 Jackson 在反序列化期间忽略空字段?还是这是与泽西岛有关的行为?
【问题讨论】:
-
AFAIK,这个问题一般适用于杰克逊。此外,无论是在构造函数中还是在变量初始值设定项中设置默认值,症状都是相同的。
标签: jackson jersey deserialization