2012-02-28 10 views
1

私はJavaクラスをデシリアライズしようとするといくつかの問題があります。 私のクラスは次のとおりです。Jackson JSONとJAVAを使用して多形LinkedListをデシリアライズする方法は?

Abstract Class A { 
Long ID 
String name 
... 
} 
Class B extends A{ 
String Type 
String Value 
} 
Class C extends A{ 
List<A> typedList; 
} 

そして、私のシリアル化/ Deseralization方法:Cクラスの内部

public String serialize(T object) { 
     String returnValue = ""; 

     try { 
      returnValue = mapper.writeValueAsString(object); 

     } catch (JsonGenerationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JsonMappingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     System.out.println(returnValue); 
     return returnValue; 
    } 

public List<T> unserialize(String data, Class<?> clazz) { 
     List<T> returnValue = new LinkedList<T>(); 
     //JavaType topMost = mapper.getTypeFactory().constructParametricType(MyWrapper.class, ActualClassRuntime.class); 
     try { 

      returnValue = (List<T>) mapper.readValue(data,clazz); 
     } catch (JsonParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JsonMappingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return returnValue; 
    } 

リストは、BとCの要素が含まれています。シリアライゼーションは問題なく行われますが、Cを逆シリアル化しようとすると、JacksonはtypedListを正しく再構築できません。 LinkedListではなくLinkedHashMapを使用し、正しい型を使用しないでください。 この問題を解決する方法はありますか? ありがとうございます!

+0

@alfasinこれはPHPとは関係ありません – NimChimpsky

答えて

6

リストを取得する場合は、リストタイプを渡す必要があります。タイプはclazzですが、タイプはList<T>です。 clazzListの場合でも、これは機能しません。 正しいタイプを渡す必要があります。しかし、List(およびMap)型では、さらに内容の型を指定する必要があります。

TypeReferenceが原因Javaの型消去に使用されている必要があり
List<MyType> list = mapper.readValue(jsonSource, new TypeReference<List<MyType>>() { }); 

:どのように動作することのようなものです。

これらは引数として渡された場合にも、動的にコンポーネントから構造化タイプを構築することができます。

Class<?> elem = ...; 
List<?> list = mapper.readValue(jsonSource, 
    mapper.getTypeFactory().constructCollectionType(ArrayList.class, elem); 

をあなたがLinkedHashMapを取得する理由が理由だけで不足しているタイプの情報である:JSONオブジェクトに遭遇した場合は、要求タイプjava.lang.Objectです(バインドするタイプがList.classの場合)、これが使用されるタイプです。

+1

助けてくれてありがとう。チャーム=のように働いた。) – user1238518

+0

うれしいことを聞いてうれしい! – StaxMan

関連する問題