Как сериализовать иерархию наследования без дополнительных полей маркера (только на основе набора полей)? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть такая иерархия классов:

public class Zoo {
    public Animal animal;

    @JsonTypeInfo(
      use = JsonTypeInfo.Id.NAME, 
      include = As.PROPERTY, 
      property = "type")
    @JsonSubTypes({
        @JsonSubTypes.Type(value = Dog.class, name = "dog"),
        @JsonSubTypes.Type(value = Cat.class, name = "cat")
    })
    public static class Animal {
        public String name;
    }

    @JsonTypeName("dog")
    public static class Dog extends Animal {
        public double barkVolume;
    }

    @JsonTypeName("cat")
    public static class Cat extends Animal {
        boolean likesCream;
        public int lives;
    }

}

Например, если я хочу сериализовать dog, я получаю следующий json:

{
    "animal": {
        "type": "dog",
        "name": "lacy",
        "barkVolume": 0
    }
}

(Как вы можете видеть, оно содержит дополнительное поле type)

и наоборот (Если вы хотите десериализовать JSON в объект, я должен предоставить дополнительное поле type)

Я не хочуиметь это дополнительное поле.Я хочу сериализовать / десериализовать в зависимости от установленных полей.Например, если json содержит поле barkVolume, очевидно, что это Dog, а если json содержит likesCream lives - это Cat.

Если эти поля не предоставлены, я готов получить исключение.

Есть ли способ проще, чем написать собственный сериализатор / десериализатор?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...