【问题标题】:Jackson deserialization: How to get a default value even if the JSON property was nullJackson 反序列化:即使 JSON 属性为空,如何获取默认值
【发布时间】: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


【解决方案1】:

在这个意义上,基于所包含的值,无法忽略来自 JSON 有效负载的数据(您可以使用 ignoral 来忽略给定属性的所有值)。 所以如果你想避免空赋值,你需要定义一个只会吞下null值的setter(也就是说,只赋值非空)。

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

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

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

我认为这属于按属性处理的原因是,这似乎是某些属性的特定规则。虽然如果看起来用户真的很喜欢这样的 null-ignor,也许也可能有一个匹配的全局设置。

【讨论】:

    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2020-01-25
    相关资源
    最近更新 更多