【问题标题】:Jackson ObjectMapper setSerializationInclusion() not workingJackson ObjectMapper setSerializationInclusion()不起作用
【发布时间】:2016-09-21 06:26:15
【问题描述】:

我刚刚开始熟悉 Jackson 绑定。但是,当我测试 setSerializationInclusion(JsonInclude.Include.NON_NULL) 时,我发现它有时不起作用。

这是我的代码

package com.blithe.main;

import com.blithe.model.Student;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Jackson_2_NullValue {
    public static void main(String[] args) throws JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper();


        Student s = new Student();
        String stundetString = mapper.writeValueAsString(s);
        System.out.println(stundetString);


        // exclude null fields
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        s.setName("ss");
        stundetString = mapper.writeValueAsString(s);
        System.out.println(stundetString);
    }
}

和 POJO

package com.blithe.model;

import java.util.Date;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

// @JsonIgnoreProperties(ignoreUnknown = true)
// exclude null fields for the whole class
// @JsonInclude(Include.NON_NULL)
public class Student {

    // exclude the field whe it's empty ("")
    // @JsonInclude(value=Include.NON_EMPTY)
    private String name;

    private Integer age;

    private Date birth;

    // Jackson ignores it
    @JsonIgnore
    private String nickName;

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
}

输出是

{"name":null,"age":null,"birth":null}
{"name":"ss","age":null,"birth":null}

后一个应该排除空值,但事实并非如此。

但是,当我以这种方式放置代码时。

package com.blithe.main;

import com.blithe.model.Student;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Jackson_2_NullValue {
    public static void main(String[] args) throws JsonProcessingException {

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

        Student s = new Student();
        String stundetString = mapper.writeValueAsString(s);
        System.out.println(stundetString);


        // exclude null fields
        // mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        s.setName("ss");
        stundetString = mapper.writeValueAsString(s);
        System.out.println(stundetString);
    }
}

它适用于下面的输出

{}
{"name":"ss"}

这是正常的还是只是某种错误?我想念什么吗?唯一的 maven 依赖项是 jackson-databind 2.7.4。欢迎任何讨论。谢谢!

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    使用时不要更改ObjectMappers 设置。使用映射器后,并非所有设置都会生效,因为缓存了序列化器和反序列化器。

    配置一次实例,首次使用后不要更改设置。这样做是为了线程安全和性能。

    http://wiki.fasterxml.com/JacksonFAQThreadSafety http://wiki.fasterxml.com/JacksonBestPracticesPerformance

    【讨论】:

    • 两个链接都失效了
    • 链接已损坏
    【解决方案2】:

    所以关键是如果您在多个地方使用 ObjectMappers,请尽量不要一次又一次地创建对象。它需要第一次初始化的配置。

    如果您在全球范围内不断更改,它将无法正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2014-05-06
      • 2018-07-09
      • 2016-11-03
      • 2019-01-28
      • 2014-10-30
      • 2019-11-09
      相关资源
      最近更新 更多