如何检查 JSON 字段为空和 null

How to check JSON field is empty and null

我正在尝试检查 JSON 字段是否为空或 null,它适用于空字符串而不适用于 null

Lombok 我只是用来覆盖 ToString,但我正在使用 Jackson 库

import lombok.ToString;

@ToString
public class DefaultModel {

    private String name;
    private String age;  

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        if (age.trim().isEmpty()||age==null) {
            this.age="101";
        } else {
            this.age=age;
        }
    }
}

这是控制器:

@RequestMapping(value="/default", method=RequestMethod.POST)
public DefaultModel m1(@RequestBody() DefaultModel model) {
    System.out.println(model);
    return model;
}

它对空字符串有效,但当我没有在正文中传递 JSON 字段时无效

失败案例:

{
    "name":"some"
}

我知道另一种情况是愚蠢的,但我试过了,而且我什至不想为此空值提供 .1%

{
    "name":"some",
    "age":null
}

Jackson 管理要插入到反序列化 pojo 中的值的一种好方法是实现自定义 Jackson 反序列化器。在您的情况下,它看起来像这样:

class DefaultModelDeserializer extends JsonDeserializer<DefaultModel> {

    @Override
    public DefaultModel deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        DefaultModel responseModel = jp.readValueAs(DefaultModel.class);

        DefaultModel finalModel = new DefaultModel();
        finalModel.setName(responseModel.name);
        finalModel.setAge(responseModel.age == null || age.trim().isEmpty() ? "101" : responseModel.age);

        return finalModel;
    }

}

然后你的 DefaultModel class 应该用你的自定义反序列化器注释:

@JsonDeserialize(using = DefaultModelDeserializer.class)
public class DefaultModel {

    ...
}

在您的 if 语句中:if (age.trim().isEmpty() || age==null) 需要先进行 null 检查,否则如果值为 null,则在调用 age.trim() 方法时您将得到 NullPointerException。

例如只需将其更改为:if (age==null || age.trim().isEmpty())