Джексон печатает объекты, хотя NON_EMPTY установлен - PullRequest
0 голосов
/ 31 октября 2018

Часть моей программы превращает объекты в строку 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, которое является пустой строкой. В моих настройках Джексона я добавил Include.NON_EMPTY с setSerializationInclusion, что должно предотвратить включение этих свойств в YAML, что и происходит.

Без Include.NON_EMPTY

---
dog:
  sound: ""

С Include.NON_EMPTY

---
dog: {}

Вопрос:

Даже если объект полностью пуст, он все равно включается в YAML, что для меня не имеет смысла. В моем случае Animals и Dog - это классы из библиотеки, в которые я не должен вносить никаких изменений.

Есть что-то, что я пропускаю? Как я могу удалить объекты, которые являются полностью пустыми из результирующей строки YAML?

1 Ответ

0 голосов
/ 31 октября 2018

Похоже, что нет готового решения, поэтому я бы посоветовал вам внедрить собственный сериализатор

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