即使设置了NON_EMPTY,Jackson也将打印对象

时间:2018-10-31 16:11:14

标签: java jackson yaml

程序的一部分将对象转换为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中添加了setSerializationInclusionInclude.NON_EMPTY,这是为了防止将这些属性包含在YAML中。

没有--- dog: sound: ""

Include.NON_EMPTY

使用--- dog: {}

Animals

问题:

即使对象完全为空,它仍然包含在YAML中,这对我来说没有意义。就我而言,Dog$line = Get-Content D:\tmp\test.txt | Select-String TextString | Select-Object -ExpandProperty Line Get-Content D:\tmp\test.txt | ForEach-Object {$_ -replace $line,'TextString = VALUEIWANT'} | Set-Content D:\tmp\TEXTNEW.txt 是库中的类,我不应在其中更改任何代码。

我有什么要注意的吗?如何从生成的YAML字符串中删除完全为空的对象?

1 个答案:

答案 0 :(得分:2)

似乎没有开箱即用的解决方案,所以我建议您应该实现自己的序列化器

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();
    }
}