2015-07-07 3 views
2

У меня есть такие массивы.Java - десериализация Джексона - как десериализировать массив интерфейса?

{ 
    ImplArray1:[ 
     { 
      ... 
     } 
     , ... 
    ], 
    ImplArray2:[ 
     { 
      ... 
     } 
     , ... 
    ] 
} 

которые оба Impl1 и Impl2 реализовать тот же интерфейс.

Как я могу десериализовать оба массива на два списка? < Интерфейс>?

Отредактировано: My god. Вопрос не имеет смысла. Очень жаль, что он был плохим в жизни.

Что я имею в виду, массив ImplArray1 содержит Impl1, а массив ImplArray2 содержит Impl2. Оба Impl1 и Impl2 реализуют один и тот же интерфейс. Как я могу десериализовать оба в List < Interface1>?

+0

Вы имеете в виду, что Impl1 и Impl2 оба реализуют один и тот же интерфейс? –

+0

Возможно, этот ответ помогает, сериализация/десериализация http://stackoverflow.com/a/31022354/928952 – Danielson

ответ

2

Единственный способ, которым мне удалось вытащить что-то близкое к требованию, - это если у вас есть суперкласс, который расширяется обеими реализациями. Суперкласс может реализовать общий интерфейс

ObjectMapper om = new ObjectMapper(); 
TypeFactory tf = om.getTypeFactory(); 

// map key type 
JavaType stringType = tf.constructType(String.class); 
// map value type 
JavaType listOfSuper = tf.constructParametrizedType(List.class, List.class, Super.class); 
// map type 
JavaType mapType = tf.constructMapType(Map.class, stringType, listOfSuper); 
// finally, do the parsing 
Reader fr = new FileReader("C://Temp/xx.json"); 
Map<String, List<Interface>> map = (Map<String, List<Interface>>)om.readValue(fr, mapType); 

static interface Interface 
{ 
} 

static class Super implements Interface 
{ 
    public String name = ""; 
    public int age = 0; 
} 

static class Impl1 extends Super 
{ 
} 

static class Impl2 extends Super 
{ 
} 
+0

работает отлично, спасибо. – Hamid

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