【问题标题】:ObjectMapper - How to send null value in JSONObjectMapper - 如何在 JSON 中发送空值
【发布时间】:2018-12-16 10:40:59
【问题描述】:

根据第三方 API 规范,如果不存在值,我需要使用 ObjectMapper 在 JSON 中发送空值,

预期结果:"optional": null

如果存在可选值,则发送"optional": "value"

我在Jackson – Working with Maps and nulls没有找到这样的选项

代码:

requestVO = new RequestVO(optional);
ObjectMapper mapper = new ObjectMapper();
String requestString = mapper.writeValueAsString(requestVO);

类:

public class RequestVO {
   String optional;
   public RequestVO(String optional) {
      this.optional = optional;
   }

public String getOptional() {
    return optional;
}

public void setOptional(String optional) {
    this.optional= optional;
}

【问题讨论】:

    标签: java json null objectmapper


    【解决方案1】:

    在你的类中添加@JsonInclude(JsonInclude.Include.USE_DEFAULTS)注解。

    @JsonInclude(JsonInclude.Include.USE_DEFAULTS)
    class RequestVO {
        String optional;
    
        public RequestVO(String optional) {
            this.optional = optional;
        }
    
        public String getOptional() {
            return optional;
        }
    
        public void setOptional(String optional) {
            this.optional = optional;
        }
    }
    

    例子:

    RequestVO requestVO = new RequestVO(null);
    
    ObjectMapper mapper = new ObjectMapper();
    try {
        String requestString = mapper.writeValueAsString(requestVO);
        System.out.println(requestString);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    

    输出:

    {"optional":null}
    

    有值:

    RequestVO requestVO = new RequestVO("test");
    
    ObjectMapper mapper = new ObjectMapper();
    try {
        String requestString = mapper.writeValueAsString(requestVO);
        System.out.println(requestString);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    

    输出:

    {"optional":"test"}
    

    您可以在偶数属性上使用@JsonInclude 注释。因此,通过这种方式,您既可以序列化为 null,也可以在序列化时忽略某些属性。

    【讨论】:

    • @user7294900 我更新了答案。它为您提供了序列化一些空属性并忽略其他一些属性的选项。
    【解决方案2】:

    您可以这样配置您的 ObjectMapper:

    ObjectMapper mapper = new ObjectMapper();
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    

    如果 JSON 请求中不存在任何值,您处理的将有一个 null,如您所料。

    如果需要,您甚至可以为 ObjectMapper 配置 Spring bean。

    编辑:

    我误解了这个问题,他对 JSON 响应感兴趣,而不是对解析的对象感兴趣。 这种情况下正确的属性是JsonInclude.Include.USE_DEFAULTS

    为混乱道歉。

    【讨论】:

    • 你的意思是Include.NON_NULL?它删除了可选参数
    • 是的,在这种情况下,它只会处理存在的值,否则默认为null。但是再次阅读我想我误解了这个问题。您希望 JSON 响应始终具有正确的字段吗?与处理请求无关。
    • 如果您使用此设置,它不会按照 OP 的要求进行序列化。它不序列化空值。看一下序列化的字符串,当你传递 Include.NON_NULL 时它什么都不包含。
    • 你是对的@EmreSavcı 我误解了目标并已经编辑了问题以反映这一点并为我的困惑道歉。
    猜你喜欢
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 2017-09-23
    • 2015-10-25
    • 1970-01-01
    相关资源
    最近更新 更多