[英]Deserialize JSON string generated from .NET using Jackson
我在我的课程和代码中提到了这个问题,但这次又出现了另一个错误。
自从上述问题以来,我已经向 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":"错误的密码或用户名","Success":false,"Username":"User1"}}
请注意上面 JSON 中的__type
。 这是 .NET 创建的用于跟踪“SubPacket”是什么类型的对象的东西。
问题是如何在 Java 端使用 Jackson 反序列化它?
它给了我以下错误:
org.codehaus.jackson.map.JsonMappingException:无法将类型 id 'LoginRequestReply:#MyPackage.DataPackets' 解析为 [简单类型,类 MyPackage.DataPacket] 的子类型 [来源:java.io.StringReader@40561798; 行:1,列: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
{
}
因此,一种解决方案(我觉得很丑)是调整 JsonSubTypes,使其看起来与在 C# 端创建的相同:
@JsonSubTypes(
{
@JsonSubTypes.Type(value = LoginRequest.class, name = "LoginRequest:#MyPackage.DataPackets"),
@JsonSubTypes.Type(value = LoginRequestReply.class, name = "LoginRequestReply:#MyPackage.DataPackets")
})
我还没有找到更好的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.