我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目标类型的名称。更清洁的解决方案会是什么样子? –