2010-08-08 3 views
1

다형성 유형의 JSON 수집을 코드에서 봐 주시기 바랍니다 :가 해제 직렬화 할 수 없습니다 내가 정말 짜증나는 문제가

ObjectMapper mapper = new ObjectMapper(); 
    List<Message> messageList = new ArrayList<Message>(); 
    messageList.add(new RoomTextMessage(1,"2","22",1)); 
    messageList.add(new PresenceMessage(1,1,2, UserStatus.OFFLINE)); 
    mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS); 
    String s = mapper.writeValueAsString(messageList); 


    mapper.convertValue(s,???) 

RoomTextMessage 및 PresenceMessage는 메시지를 확장합니다. 내가 밖으로 인쇄 할 때

그래서들 writeValueAsString 후,이 내가 무엇을 얻을 수 있습니다 :

[["com.delver.chateau.message.RoomTextMessage",{"text":"22","roomId":"2","userId":1,"sequence":1}],["com.delver.chateau.message.PresenceMessage",{"friendId":2,"status":"OFFLINE","userId":1,"sequence":1}]] 

내가 ArrayList를로 다시 은밀한하는 방법을 몰라, 나는 ObjectMapper이 가지고 거의 모든 API가 있습니다.

약간의 도움은 매우 감사하겠습니다.

답변

0

Java 유형 삭제로 인해 바인딩 할 일반 유형을 지정할 수 없습니다. 목록에 JSON을 구속 할 충분한 제네릭 타입 정보를 전달하기 위해, 당신과 같이, 하나 TypeReference 또는 만약 javaType을 방법을 사용해야합니다 :

List<Message> result = mapper.readValue(s, new TypeReference<List<Message>>() { }); 

가 만약 javaType을 사용하기를, 당신은 java.lang의를 전달하여 방법을 구성 할 필요가 각각 TypeFactory (자세한 내용은 JavaDoc을 체크 아웃)에 .reflect.Type : 익명 내부 클래스를 좋아하지 않는 경우

List<Message> result = mapper.readValue(s, TypeFactory.collectionType(ArrayList.class, Message.class)); 

가 (당신이 유사 TypeFactory.parametericType로, 제네릭 유형의 모든 종류를 만들 수 있습니다 (.. .)).

+0

이것은 내가 시도한 주먹입니다. 불행히도이 일은 잘되지 않습니다. 하지만 실제로는 실제로 배열로 보내고 Json은 각 배열 버킷에 형식 정보를 포함 시켰습니다. – Roman

관련 문제