【问题标题】:How to check JSON field is empty and null如何检查 JSON 字段是否为空
【发布时间】:2018-07-17 20:47:05
【问题描述】:

我正在尝试检查 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"
}

我知道另一种情况是愚蠢的,但我试过了,而且我什至不想为这个空值给出 0.1%

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

【问题讨论】:

    标签: java jackson lombok


    【解决方案1】:

    管理要插入反序列化 pojo 的值的一种不错的 Jackson 方法是实现自定义 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 类应该使用您的自定义反序列化器进行注释:

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

    【讨论】:

    • 如果不传递正文中的属性,它就不起作用,但至少感谢我通过"age":null
    • @Deadpool 我以前不明白你的问题。我已经用我认为可以解决您的问题的内容编辑了答案。
    • 我知道这个设置默认值可以解决,但我确实有 10 个这样的属性,不建议设置默认值
    • 有什么方法可以检查缺少的 JSON 字段吗?这样我们就可以在 setter 方法中做一些事情来解决它或任何注释等。
    • @Deadpool 是的。使用自定义 Jackson 反序列化器。我已经编辑了答案以显示您需要做什么。
    【解决方案2】:

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

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

    【讨论】:

    • 当我们不在正文中发送该字段时,它在一种情况下不起作用
    • @Deadpool 您一直在考虑 JSON,但这是您代码中的一个不相关的错误。不管age如何进来,条件age.trim().isEmpty() || age==null都是错误的。无条件错误。先解决这些问题,不假思索(有时投掷是想要的动作,但情况不同,写法也不同)。打开警告,我的 Eclipse 会说“条件始终为假”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 2012-02-21
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多