2011-12-03 4 views
0
내 클래스와 코드에 대한이 질문에 refeer

를 사용하여 .NET에서 생성 된 문자열,하지만 다른 오류이 시간 : Deserializing JSON with Jackson - Why JsonMappingException "No suitable constructor"?역 직렬화 된 JSON 잭슨

위의 질문 ProtocolContainer에 빈 생성자를 추가 한 이후이 있습니다.

이제 .NET 응용 프로그램 (C#)이 DataContractJsonSerializer를 사용하여 JSON 문자열을 생성하는 상황입니다. ProtocolContaier에는 DataPacket으로 정의 된 "SubPacket"이 있으며 DataPacket에 대한 하위 클래스가 있습니다 (그래서 이것은 다형성 문제입니다).

문자열은 다음과 같습니다

{"DataPacketJSONString":null,"DataPacketType":"MyPackage.DataPackets.LoginRequestReply","MessageId":6604,"SenderUsername":null,"SubPacket":{"__type":"LoginRequestReply:#MyPackage.DataPackets","Reason":"Wrong pass or username","Success":false,"Username":"User1"}}

참고 위의 JSON에서 __type. 이것은 .NET이 "SubPacket"이 어떤 유형의 객체인지 추적하기 위해 만든 것입니다.

문제는 Jackson을 사용하여 Java 측에서이를 deserialize하는 방법입니까?

org.codehaus.jackson.map.JsonMappingException: Could not resolve type id 'LoginRequestReply:#MyPackage.DataPackets' into a subtype of [simple type, class MyPackage.DataPacket] at [Source: [email protected]; line: 1, column: 168] (through reference chain: MyPackage.ProtocolContainer["SubPacket"])

그리고 내 생각 엔 잭슨 위의 JSON 문자열의 __type을 해석하지 못할 것입니다 : 그것은 나에게 다음과 같은 오류를 제공

. 그리고 그것은 그것의 형식에 대한 회비라고 생각합니다. 문제는 어떻게 해결 될 수 있는가?

DataPacket.java - 슈퍼 클래스, ProtocolContainer에 정의 (위의 링크 참조)

package MyPackage; 

import org.codehaus.jackson.annotate.JsonSubTypes; 
import org.codehaus.jackson.annotate.JsonTypeInfo; 

import MyPackage.DataPackets.*; 

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="__type") 
@JsonSubTypes(
{ 
    @JsonSubTypes.Type(value = LoginRequest.class, name = "LoginRequest"), 
    @JsonSubTypes.Type(value = LoginRequestReply.class, name = "LoginRequestReply") 
}) 
public class DataPacket 
{ 

} 

답변

1

그래서, 하나 개의 솔루션은 (내가 못생긴 찾을 수 있음)을 JsonSubTypes을 적용하는 것이가 만든 것과 같은 모양 때문에 C# end :

나는 더 좋은 방법을 발견했다.

+0

나는 이것이 못생긴 것이 무엇인지 이해하지 못합니다. JSON의 유형 이름이 Java 대상 유형의 이름에 맵핑되는 것으로 보입니다. 더 깨끗한 솔루션은 어떻게 생겼습니까? –