2011-12-03 39 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」がどのようなオブジェクトの種類を追跡するために作成したものです。

問題はジャクソンを使用してJava側で逆シリアル化する方法ですか?

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

ので、1つの解決策は、(私が醜い見つけること)JsonSubTypesを適応させることである、それは上に作成されたものと同じに見えますので、 C#end:

私はより良い方法を見つけました。

+0

私はこれが醜いのはどういうことを理解していません。 JSONの型名は、Javaのターゲット型の名前にマップされているようです。よりクリーンなソリューションはどのように見えますか? –

関連する問題