2012-02-28 6 views
1

Java 클래스를 deserialize하려고 할 때 몇 가지 문제가 있습니다. 내 클래스는 다음과 같습니다Jackson JSON 및 JAVA를 사용하여 다형성 LinkedList를 deserialize하는 방법은 무엇입니까?

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

그리고 내 직렬화/Deseralization 방법 :

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; 
    } 

는 C 클래스 내부의 목록 B와 C 요소가 포함되어 있습니다. 직렬화는 문제없이 수행되지만 C를 비 직렬화하려고하면 Jackson은 내 typedList를 올바르게 다시 작성할 수 없습니다. LinkedList 대신 LinkedHashMap을 사용하므로 올바른 유형을 사용하지 마십시오. 이 문제를 해결하는 방법은 무엇입니까? 미리 감사드립니다.

+0

@alfasin 이건 PHP와 아무런 관련이 없습니다 – NimChimpsky

답변

6

목록을 얻으려면 목록 유형을 전달해야합니다. 여기서 유형은 clazz이고 예상 유형은 List<T>입니다. clazzList 인 경우에도 작동하지 않습니다. 그래서 적절한 유형을 전달해야합니다. 그러나 List (및 Map) 유형의 경우 내용 유형을 지정해야하며 variable 유형은 지정하지 않아야합니다. 무엇 작동하는 것은 같은 것입니다 : 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

관련 문제