不要将空对象包括给杰克逊

Posted

技术标签:

【中文标题】不要将空对象包括给杰克逊【英文标题】:Do not include empty object to Jackson 【发布时间】:2019-04-13 13:18:36 【问题描述】:

我正在尝试使用 spring boot 创建 json。

类:

public class Person 
    private String name;
    private PersonDetails details;

//     getters and setters...

实现:

Person person = new Person();
person.setName("Apple");
person.setDetails(new PersonDetails());

因此,Person 的实例为空,details 为空,这正是 Jackson 返回的内容:

"person": 
    "name": "Apple",
    "details": 

我想要json 没有空括号:

"person": 
    "name": "Apple"

这个问题对我没有帮助:

How to tell Jackson to ignore empty object during deserialization? How to ignore "null" or empty properties in json, globally, using Spring configuration

更新 1:

我使用的是 Jackson 2.9.6

【问题讨论】:

用于忽略空的特定对象的自定义序列化器/反序列化器听起来是不错的解决方案。所以例如@JsonInclude(Include.NON_NULL) 在这种情况下不起作用,因为你没有空对象,你有没有填充属性的对象。为什么要忽略 JSON 中的空对象? 【参考方案1】:

如果没有自定义序列化程序,jackson 将包含您的对象。

解决方案 1:用 null 替换新对象

person.setDetails(new PersonDetails());

person.setDetails(null);

并添加

@JsonInclude(Include.NON_NULL)
public class Person 

解决方案 2:自定义序列化程序

public class PersonDetailsSerializer extends StdSerializer<PersonDetails> 

    public PersonDetailsSerializer() 
        this(null);
    

    public PersonDetailsSerializer(Class<PersonDetails> t) 
        super(t);
    

    @Override
    public void serialize(
            PersonDetails personDetails, JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonProcessingException 
        // custom behavior if you implement equals and hashCode in your code
        if(personDetails.equals(new PersonDetails())
           return;
        
        super.serialize(personDetails,jgen,provider);
    

在你的PersonDetails

public class Person 
    private String name;
    @JsonSerialize(using = PersonDetailsSerializer.class)
    private PersonDetails details;

【讨论】:

有没有办法在全球范围内为所有班级这样做?

以上是关于不要将空对象包括给杰克逊的主要内容,如果未能解决你的问题,请参考以下文章

Lua 脚本将空数组转换为对象

Ajax 将空对象发布到 mvc 控制器

Swift Codable 将空 json 解码为 nil 或空对象

jquery ajax后混合数组对象将空数组发送到php

new的实现机制

将空 JSON 数组反序列化为空 TreeMap