当前位置: 首页 > 知识库问答 >
问题:

使用jackson忽略json body中的空元素

长孙嘉容
2023-03-14

我正在用java中的jackson构建一个json体。它会像下面这样

{
   "subject": "math",
    "marks": "100",
    "student":{
        "name": "x",
        "class": "8"
    }
 }

基于不同的 REST URI,json 主体必须忽略某些字段或元素。如何使用杰克逊忽略上述 json 正文中的“学生”部分?当我忽略它时,我应该只能得到

{ "subject": "math", "marks": "100"}

但我得到它如下,这是不正确的-

{ "subject": "math", "marks": "100","student":{}}

我有两个带有getters和setters的类,一个作为主语,另一个作为学生。我尝试使用@JsonIgnore,但是它忽略了所有的URI,这是我不想要的。我也试过@JsonInclude(包含。非空)。我如何实现这一点?

我在这里添加我的代码。基于不同的REST URI,json主体必须忽略一些字段或元素。例如,对于一个URI,它应该包括所有字段,对于另一个URI,它应该忽略学生。分数=新分数();

    score.setSubject("math");
    score.setMarks("100");

    Score.Student student =score.new Student();
    score.setStudent(student);

    switch (type) {
    case StudentAdd:
        score.setSubject("math");
        score.setMarks("100");
        break;
    case StudentDelete:
        score.setSubject("math");
        score.setMarks("100");
        break;
    case StudentComplete:
        score.setChangeReason("C");

    default:
        break;
        score.setSubject("math");
        score.setMarks("100");

    score.setStudent(student);

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
    //objectMapper.setSerializationInclusion(Include.NON_NULL);
    objectMapper.setSerializationInclusion(Include.NON_EMPTY);

    StringWriter jsonBody = new StringWriter();
    objectMapper.writeValue(jsonBody, score);

    return jsonBody.toString();
}

    //@JsonInclude(Include.NON_EMPTY)
    class Score {

        private String subject;
        private String marks;
        private Student student;

        public String getSubject() {
            return subject;
        }

        public void setSubject(String subject) {
            this.subject = subject;
        }

        public String getMarks() {
            return marks;
        }

        public void setMarks(String marks) {
            this.marks = marks;
        }

        public Student getStudent() {
            return student;
        }

        public void setStudent(Student student) {
            this.student = student;
        }

    //@JsonInclude(Include.NON_NULL)
    class Student {

        private String name;

        @JsonProperty("class")
        private String clazz;

        public String getName() {
            return name;
        }

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

        public String getClazz() {
            return clazz;
        }

        public void setClazz(String clazz) {
            this.clazz = clazz;
        }

}
    }
   }
     }

共有3个答案

胡云瀚
2023-03-14

在ObjectMapper中将WRITE_NULL_MAP_VALUES设置为false。

代码:

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationConfig.Feature.WRITE_NULL_MAP_VALUES, false);
巢烨
2023-03-14

编辑

这些帖子似乎是重复的。

编辑2

使用@JsonView而不是@JsonFilter

下面是使用 @JsonView 打印同一 JSON 对象的不同视图的示例代码:

{ "科目":"数学","分数":" 100"}

{“主题”:“数学”,“标记”:“100”,“学生”:{“名称”:“x”,“类”:“8”}}

public class Views {
    public static class Filtered {}
    public static class All extends Filtered {}
}

public class Student {
    private String name;

    @JsonProperty("class")
    private String clazz;

    public String getName() {
        return name;
    }

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

    public String getClazz() {
        return clazz;
    }

    public void setClazz(String clazz) {
        this.clazz = clazz;
    }
}

public class Score {
    @JsonView(Views.Filtered.class)
    private String subject;

    @JsonView(Views.Filtered.class)
    private String marks;

    @JsonView(Views.All.class)
    private Student student;

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getMarks() {
        return marks;
    }

    public void setMarks(String marks) {
        this.marks = marks;
    }

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }
}

public class JsonTest {
    public static void main(String[] args) throws JsonProcessingException {
        Student student = new Student();
        student.setName("x");
        student.setClazz("8");

        Score score = new Score();
        score.setSubject("math");
        score.setMarks("100");
        score.setStudent(student);

        ObjectMapper mapper = new ObjectMapper();

        //do not serialize student property
        System.out.println(mapper.writerWithView(Views.Filtered.class).writeValueAsString(score));

        //also serialize student property
        System.out.println(mapper.writeValueAsString(score));
    }
}
齐迪
2023-03-14

这可以在注释上使用< code>JsonInclude进行配置,其值为< code>NON_NULL而不是< code>NON_EMPTY。

对于NON_EMPTY和NON_NULL的Javadoc还不太清楚,但是我的实验表明,使用NON_NULL可以像您期望的那样使用Jackson 2.6.2。

@JsonProperty
@JsonInclude(Include.NON_NULL)
private Student student;

示例

ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(new Foo(100, new Student("bob"), "math")));
System.out.println(mapper.writeValueAsString(new Foo(100, null, "math")));

输出

{"marks":100,"subject":"math","student":{"name":"bob"}}
{"marks":100,"subject":"math"}

注意这也可以使用全局设置

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
 类似资料:
  • 这是我的东西 当我得到响应时,我看到 我的看起来像 问题 如何消除中的值?

  • 我使用Spring框架从GET请求接收JSON。所有的工作都很好,直到在DB中输入了一个错误的值,发生了以下情况: 02-25 14:46:04.035:E/AndroidRuntime(12271):org.springframework.http.converter.httpmessagenotreadableException:无法读取JSON:无法从字符串值“-3600”构造java.ut

  • 读取文件已支持 windows 系统,版本号大于等于 1.3.4.1; 扩展版本大于等于 1.2.7; PECL 安装时将会提示是否开启读取功能,请键入 yes; 测试数据准备 $config = ['path' => './tests']; $excel = new \Vtiful\Kernel\Excel($config); ​ // 写入测试数据 $filePath = $excel->f

  • 问题内容: 我目前正在使用杰克逊2.1.4,并且在将对象转换为JSON字符串时忽略字段时遇到了一些麻烦。 这是我的类,它充当要转换的对象: 这是我如何转换它: 这是输出: 如何避免这些空值?我只想获取“订阅”目的所需的信息! 这正是我要查找的输出: 我还尝试了@JsonInclude(Include.NON_NULL)并将所有变量都设置为null,但是它也不起作用!感谢您的帮助! 问题答案: 您将

  • 知道我做错了什么吗?如果重要的话,我将使用Jackson-core 2.1.1。

  • 下面是我的类,它充当要转换的对象: 下面是我的转换方法: 输出如下: 下面正是我要查找的输出: 我还尝试了@jsonInclude(include.non_null),并将我的所有变量置为null,但也没有起作用!谢谢你们的帮助!