2017-01-17 1 views
1

Вот пример 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 отметить:

  1. контакты является полиморфным абстрактным типом (см POJO, ниже)
  2. информации о типе (например, `addresss) содержатся в качестве ключа в обертке
  3. эта обертка может быть объект, если имеется только одно значение (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)

+0

http://json2java.azurewebsites.net/ Проверьте эту ссылку, чтобы сгенерировать java-класс из json и внести необходимые изменения. – Sreemat

+0

Спасибо за отзыв, но этот сайт генерирует POJO «Контакты», который является промежуточным отображением/преобразованием I пытаюсь избежать, воспользовавшись полиморфными функциями Джексона. – Casey

+0

Измените контакт лично на объект вместо класса, чтобы вы могли ввести его позже. – Sreemat

ответ

1

Вам нужно будет написать собственный десериализатор и зарегистрировать его с Джексоном. Реализация будет проверять начальный старт, затем анализировать соответственно. Подумайте о стиле саксофона.

+0

Принимая это как ответ, так как это единственное возможное решение, отвечающее моим первоначальным требованиям. В итоге я проанализировал JSON в промежуточных POJO, а затем перебросил его в дерево типов, которое я хотел вручную. – Casey

Смежные вопросы