Я использую приведенную ниже заставку и загрузчик 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 и т. Д. И т. Д. (Это не просто один из типов животных в этоммассив)