2016-08-10 2 views
1

Вот это JSON фрагмент, который содержит массив (иконки), которые могут содержать два различных типа объектов (приложения и папки)Как десериализации массив JSON, содержащий различные типы объектов

{ 
     "icons": [{ 
      "application": { 
       "displayName": "Facebook", 
       "bundleId": "com.facebook.com" 
      } 
     }, { 
      "folder": { 
       "some": "value", 
       "num": 3 
      } 
     }] 
    } 

Как я могу создать java POJO моделирует этот вид json и затем десериализует то же самое?

Я упомянул об этом question. Но я не могу изменить json. Я собираюсь включить «тип», как там посоветуем, а затем использовать наследование для POJO двух разных объектов.

+1

Просто создать пользовательский десериализатор, который переключается в зависимости от ключа. –

+0

@BoristheSpider Никаких индивидуальных десериализаторов не требуется :) –

ответ

3

Не требуется никаких индивидуальных десериализаторов. Умный @JsonTypeInfo сделает трюк.

Ниже какие классы и интерфейсы могут быть как:

@JsonTypeInfo(use = Id.NAME, include = As.WRAPPER_OBJECT) 
@JsonSubTypes({ @Type(value = ApplicationIcon.class, name = "application"), 
       @Type(value = FolderIcon.class, name = "folder") }) 
public interface Icon { 

} 
@JsonRootName("application") 
public class ApplicationIcon implements Icon { 

    public String displayName; 
    public String bundleId; 

    // Getters and setters ommited 
} 
@JsonRootName("folder") 
public class FolderIcon implements Icon { 

    public String some; 
    public Integer num; 

    // Getters and setters ommited 
} 
public class IconWrapper { 

    private List<Icon> icons; 

    // Getters and setters ommited 
} 

Для десериализации вашего JSON, выполните следующие действия:

String json = "{\"icons\":[{\"application\":{\"displayName\":\"Facebook\",\"bundleId\":\"com.facebook.com\"}},{\"folder\":{\"some\":\"value\",\"num\":3}}]}"; 

ObjectMapper mapper = new ObjectMapper(); 
IconWrapper iconWrapper = mapper.readValue(json, IconWrapper.class); 
+1

Очень причудливый! Хорошая работа. –

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