Я пытаюсь сериализовать / десериализовать полиморфный тип с Jackson
2.9.8
, и он работает нормально, если я не помещаю объект такого типа в коллекцию, потому что по какой-то причине информация о типе тогда не записывается.Давайте рассмотрим следующий пример:
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "animalKind")
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog")
})
public interface Animal {
}
@JsonIgnoreProperties(ignoreUnknown = true)
public class Dog implements Animal {
private Boolean goodBoy;
public Boolean isGoodBoy() { return goodBoy; }
public void setGoodBoy(Boolean goodBoy) { this.goodBoy = goodBoy; }
}
Теперь давайте сериализуем экземпляр Dog
:
ObjectMapper objectMapper = new ObjectMapper();
Dog mike = new Dog();
mike.setGoodBoy(true);
// This works just fine
String mikeJson = objectMapper.writeValueAsString(mike);
System.out.println(mikeJson);
// This doesn't work
String listJson = objectMapper.writeValueAsString(Collections.singleton(mike));
System.out.println(listJson);
// This doesn't either
String mapJson = objectMapper.writeValueAsString(Collections.singletonMap("Mike", mike));
System.out.println(mapJson);
Вывод следующий:
{"animalKind":"Dog","goodBoy":true}
[{"goodBoy":true}]
{"Mike":{"goodBoy":true}}
Итак, animalKind
написано в первом случае, но не во втором и третьем.Мне не хватает некоторых настроек сериализации или это ошибка?
Спасибо!