不要将空对象包括给杰克逊
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;
【讨论】:
有没有办法在全球范围内为所有班级这样做?以上是关于不要将空对象包括给杰克逊的主要内容,如果未能解决你的问题,请参考以下文章