Вот пример JSON, который я хочу десериализовать с помощью Jackson.Deserialize polypmorphic JSON типы с именами на основе ключей
{
"person": {
"contacts": {
"address": {
"type": "Office",
"street": "1600 Amphitheatre Parkway",
"city": "Mountain View",
"state": "CA",
"zip": "94043",
"country": "United States"
},
"email": {
"type": "Home",
"emailAddress": "[email protected]"
},
"phone": [
{
"type": "Mobile",
"phoneNumber": "+1 888 555555"
},
{
"type": "Home",
"phoneNumber": "+1 888 1111111"
}
],
"website": {
"type": "work",
"webService": "URL",
"webAddress": "www.google.com"
}
},
"firstName": "Eric",
"lastName": "Schmidt"
}
}
Незначительный бит для десериализации здесь является узлом контактов. Things отметить:
- контакты является полиморфным абстрактным типом (см POJO, ниже)
- информации о типе (например, `addresss) содержатся в качестве ключа в обертке
- эта обертка может быть объект, если имеется только одно значение (
email
,address
,website
) ИЛИ массив, если есть несколько (phone
)
Целевые POJOs:
public class Person
{
public String firstName;
public String LastName;
public List<Contact> contacts; // mixes Address, Phone, Email, Website
}
public abstract class Contact {
public Long id;
}
public class Phone extends Contact
{
public String type;
public String phoneNumber;
}
// other subtypes of Contact omitted for brevity
Примечания: внешние требования требуют использование абстрактной Contact
типа. Я предпочел бы десериализовать прямо на эти POJO вместо того, чтобы иметь промежуточный Contacts
POJO, чтобы типы контактов зависали и их вручную отображали/конвертировали в мой список на другом шаге.
Я просмотрел многие другие вопросы деменции + полиморфной десериализации, но никто, кажется, не справляется с этим случаем (в частности, # 2 и # 3).
Я хочу десериализовать объект контактов на List<Contact>
.
Что нужно для правильного применения @JsonTypeInfo
и @JsonSubTypes
?
(если кому-то интересно это CapsuleCRM's JSON format)
http://json2java.azurewebsites.net/ Проверьте эту ссылку, чтобы сгенерировать java-класс из json и внести необходимые изменения. – Sreemat
Спасибо за отзыв, но этот сайт генерирует POJO «Контакты», который является промежуточным отображением/преобразованием I пытаюсь избежать, воспользовавшись полиморфными функциями Джексона. – Casey
Измените контакт лично на объект вместо класса, чтобы вы могли ввести его позже. – Sreemat