我的程序的一部分将对象转换为 YAML 字符串。下面是一个最小的示例,它产生与我遇到的问题相同的结果:
主要
ObjectMapper JSONExportMapper = new ObjectMapper(new YAMLFactory());
JSONExportMapper.setSerializationInclusion(Include.NON_NULL);
JSONExportMapper.setSerializationInclusion(Include.NON_EMPTY);
String export = JSONExportMapper.writeValueAsString(new Animals());
System.out.println(export);
动物
class Animals {
public Dog dog;
public Animals() {
this.dog = new Dog();
}
}
狗
class Dog {
public String sound = "";
}
<小时/>
问题:
如您所见,Dog
具有属性 sound
,它是一个空字符串。在我的 Jackson 设置中,我添加了 Include.NON_EMPTY
和 setSerializationInclusion
,这应该可以防止这些属性包含在 YAML 中,而事实确实如此。
没有Include.NON_EMPTY
---
dog:
sound: ""
使用Include.NON_EMPTY
---
dog: {}
<小时/>
问题:
即使该对象完全是空的,它仍然包含在 YAML 中,这对我来说没有意义。就我而言,Animals
和 Dog
是库中的类,我不应该更改其中的任何代码。
有什么我忽略的事情吗?如何从生成的 YAML 字符串中删除完全为空的对象?
最佳答案
看起来没有现成的解决方案,所以我建议您应该实现自己的序列化器
public class MyDogSerializer extends StdSerializer<Dog> {
private static final long serialVersionUID = -4796382940375974812L;
public MyDogSerializer() {
super(Dog.class);
}
@Override
public void serialize(Dog value, JsonGenerator gen, SerializerProvider serializers)
throws IOException, JsonProcessingException {
if (/** here inspect Dog value for emptiness */) {
gen.writeObject(null);
} else {
****
}
}
}
并注释 dog
属性
class Animals {
@JsonSerialize(using = MyDogSerializer.class)
public Dog dog;
public Animals() {
this.dog = new Dog();
}
}
关于java - 即使设置了 NON_EMPTY,Jackson 也会打印对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53087749/