Джексон Джексон подкласс / детские поля нераспознанные - PullRequest
0 голосов
/ 27 сентября 2018

Я использую приведенную ниже заставку и загрузчик Jackson для загрузки класса Lion:

сохранение:

public void savePerson(File f, Animal[] cache) {
    ObjectMapper saveMapper = new ObjectMapper()
                    .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
            saveMapper.setVisibilityChecker(
                saveMapper.getSerializationConfig().
                        getDefaultVisibilityChecker().
                        withFieldVisibility(JsonAutoDetect.Visibility.ANY).
                        withGetterVisibility(JsonAutoDetect.Visibility.NONE).
                        withIsGetterVisibility(JsonAutoDetect.Visibility.NONE)
            );
            ObjectWriter writer = saveMapper.writer().withDefaultPrettyPrinter();
            writer.writeValue(f, cache);
}

загрузка:

public Animal[] load(File f) {

    return new ObjectMapper().readValue(f, Animal[].class); 
//i want to keep it like this instead of writing individual savers for each animal because there are hundreds of animals

}

Это ошибка Iполучаю при попытке загрузить Lion, который является потомком класса Animal:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "roars" (class org.game.Animal), not marked as ignorable (2 known properties: , "name", "age"])
 at [Source: data/animals/entities.json; line: 48, column: 21] (through reference chain: org.game.Animal["roars"])

Вот мастер-класс Animal:

public class Animal { //note is not abstract as it can be a class on its own too

    private final String name;

    private final int age;

    public Animal(@JsonProperty("name") String name, @JsonProperty("age") int age) {
        super();
        this.name = name;
        this.age = age;
    }

}

А вот дочерний класс Lion:

public final class Lion extends Animal {

    @JsonProperty("roars")
    private int roars;

    public Lion(@JsonProperty("name") String name, @JsonProperty("age") int age) {
        super(name, age);
        roars = 10; //starts with 10 roars
    }

}

Я пробовал что-то вроде добавления объяснения подтипа для класса Animal, например:

@JsonSubTypes({
    @JsonSubTypes.Type(value = Lion.class, name = "Lion")
})
public class Animal { 
    //etc
}

, но все равно выдает эту ошибку при повторной загрузке файла json.

Что мне делать?

Примечание: сохраняемое животное [] включает в себя обычный класс Animal.class среди Zebra.class, Lion.class и т. Д. И т. Д. (Это не просто один из типов животных в этоммассив)

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