如何为Jackson反序列化指定默认值

时间:2019-01-23 11:06:03

标签: java spring-boot jackson

@ResponseBody
@RequestMapping(value="/getUser")
public JSONObject getContent(@ReqeustBody User user) 

这是我的控制器代码。

@Data
public class User{
    private String username = "administrator";
    private String password = "123456";   
    private Integer age = 18;
}

这是我的User类代码。

{
    "username":"admin",
    "password":"000",
    "age":""
}

当我POST上面的JSON时,我得到的age属性为null

我希望Jackson用默认值反序列化""中的空白字段(nullJSON)。

像这样:

{
    "username":"admin",
    "password":"000",
    "age":18
}

我该怎么办?

2 个答案:

答案 0 :(得分:1)

您可以定义一个自定义的getter属性,以在null的情况下设置默认值。

   public Integer getAge() {
        if (age == null) {
            return 18;
        } else {
            return this.age;
        }
    }

请注意,您无法更改setAge方法,因为在这种情况下不会调用它,实际上,没有age字段会通知Jackson调用该方法。


另一种选择是使用自定义构造函数,并使用值为JsonSetterNulls.SKIP注释

  

指示应该跳过输入空值并且不进行赋值的值; 这通常意味着该属性将具有其默认值

如下:

 public class User {
    @JsonSetter(nulls = Nulls.SKIP)
    private Integer age;

    public User() {
        this.age = 18;
    }

    ...
}

@JsonSetter存在于软件包com.fasterxml.jackson.annotation中,可以使用以下方式将其作为依赖项导入maven中

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>YOURVERSION</version>
</dependency>

答案 1 :(得分:0)

一种方法是让您setAge处理null的情况,例如:

 void setAge(Integer age){
   if(age!=null) this.age = age;
 }

或者您可以看一下@JsonSetter(nulls=Nulls.SKIP),我只是看了源代码,还没有尝试过:(

希望有帮助。