2011-12-03 128 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"}}

注意__type在上面的JSON。這是.NET創建的,用於跟蹤「SubPacket」是什麼類型的對象。

問題是如何在Java端使用Jackson進行反序列化?

它給了我下面的錯誤:

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#結尾:

@JsonSubTypes(
{ 
    @JsonSubTypes.Type(value = LoginRequest.class, name = "LoginRequest:#MyPackage.DataPackets"), 
    @JsonSubTypes.Type(value = LoginRequestReply.class, name = "LoginRequestReply:#MyPackage.DataPackets") 
}) 

我還沒有找到任何更好的方法。

+0

我不明白這是什麼醜陋的。在我看來,JSON中的類型名稱被映射到Java目標類型的名稱。更清潔的解決方案會是什麼樣子? –