我为我的类和代码提出了这个问题,但这次又出现了另一个错误: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,“SubPacket”:{“__ type”:“LoginRequestReply:#MyPackage.DataPackets”, “原因”:“错误的通行证或用户名”,“成功”:false,“用户名”:“用户1”}}
请注意上面JSON中的 __type
. 这是.NET创建的用于跟踪"SubPacket"是什么类型的对象的东西 .
问题是如何使用Jackson对Java端进行反序列化?
它给了我以下错误:
org.codehaus.jackson.map.JsonMappingException:无法将类型ID'LoginRequestReply:#MyPackage.DataPackets'解析为[simple type,类MyPackage.DataPacket]的子类型[Source: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
{
}
1 回答
所以,一个解决方案(我觉得很丑陋)是调整JsonSubTypes,使它看起来与在C#端创建的相同:
我没有找到更好的方法 .