java - 即使设置了 NON_EMPTY,Jackson 也会打印对象

标签 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_EMPTYsetSerializationInclusion,这应该可以防止这些属性包含在 YAML 中,而事实确实如此。

没有Include.NON_EMPTY

---
dog:
  sound: ""

使用Include.NON_EMPTY

---
dog: {}
<小时/>

问题:

即使该对象完全是空的,它仍然包含在 YAML 中,这对我来说没有意义。就我而言,AnimalsDog 是库中的类,我不应该更改其中的任何代码。

有什么我忽略的事情吗?如何从生成的 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/

相关文章:

java - 我如何在可运行的内部调用可抛出方法来创建新线程

java - 在 ActionScript3 中创建对象相等 "HashMap"作为 java HashMap

java - 测试非默认 App Engine 任务队列

json - unirest 中的 Jackson 异常 : Serialization Impossible. 找不到 ObjectMapper 实现

java - 使用 Jackson 自定义 POJO 序列化

python - 如何在不更改文件缩进的情况下使用 ruamel.yaml 包编辑 yaml 文件?

c++ - 如何在我的 CMakelists.txt 中链接 yaml-cpp?

java - 在 JENKINS 中添加 SVN_AUTHOR 和 SVN_COMMIT_MESSAGE 作为环境变量

spring-boot - 在集成 springboot 测试中无法识别自定义 Jackson2ObjectMapperBuilder

azure - azure 的 Ansible 库存插件抛出编码错误