JsonTypeInfo не написано для объекта в коллекции - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь сериализовать / десериализовать полиморфный тип с 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 написано в первом случае, но не во втором и третьем.Мне не хватает некоторых настроек сериализации или это ошибка?

Спасибо!

1 Ответ

1 голос
/ 18 марта 2019

Вам нужно указать Jackson, что вам нужна данная коллекция с чтением аннотации абстрактного типа. Смотрите пример:

CollectionType animalsListType = mapper.getTypeFactory()
    .constructCollectionType(Set.class, Animal.class);
System.out.println(mapper.writer().withType(animalsListType).writeValueAsString(Collections.singleton(mike)));

Map<String, Dog> mikeMap = Collections.singletonMap("Mike", mike);
MapType mapType = mapper.getTypeFactory().constructMapType(Map.class, String.class, Animal.class);
System.out.println(mapper.writer().withType(mapType).writeValueAsString(mikeMap));

Над отпечатками кода:

[{"animalKind":"Dog","goodBoy":true}]
{"Mike":{"animalKind":"Dog","goodBoy":true}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...