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