我为我的类和代码提出了这个问题,但这次又出现了另一个错误: Deserializing JSON with Jackson - Why JsonMappingException "No suitable constructor"?
自从上面的问题为ProtocolContainer添加了一个空构造函数。
现在情况是.NET应用程序(C#)正在使用DataContractJsonSerializer创建JSON字符串。 ProtocolContaier有一个定义为DataPacket的“SubPacket”,然后有DataPacket的子类(所以这是一个多态问题)。
字符串如下所示:
{ “DataPacketJSONString”:NULL, “DataPacketType”: “MyPackage.DataPackets.LoginRequestReply”, “的MessageId”:6604, “SenderUsername”:NULL, “子分组”:{ “__类型”:“LoginRequestReply:#MyPackage.DataPackets “‘理’:”错误 传递或用户名“,”成功“:false,”用户名“:”用户1“}}
请注意上面JSON中的__type
。这是.NET创建的用于跟踪“SubPacket”是什么类型的对象的东西。
问题是如何使用Jackson在Java端反序列化?
它给了我以下错误:
org.codehaus.jackson.map.JsonMappingException:无法解析类型 id'LoginRequestReply:#MyPackage.DataPackets'成为子类型 [简单类型,类MyPackage.DataPacket]在[来源: java.io.StringReader@40561798; line:1,column:168](通过 参考链:MyPackage.ProtocolContainer [“SubPacket”])
我的猜测是Jackson无法解释上面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
{
}
答案 0 :(得分:1)
所以,一个解决方案(我觉得很难看)就是调整JsonSubTypes,使其看起来与C#端创建的相同:
@JsonSubTypes(
{
@JsonSubTypes.Type(value = LoginRequest.class, name = "LoginRequest:#MyPackage.DataPackets"),
@JsonSubTypes.Type(value = LoginRequestReply.class, name = "LoginRequestReply:#MyPackage.DataPackets")
})
我还没有找到更好的方法。