簡體   English   中英

即使設置了NON_EMPTY,Jackson也將打印對象

[英]Jackson printing objects even though NON_EMPTY is set

我程序的一部分將對象轉換為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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM