使用Jackson反序列化从.NET生成的JSON字符串

时间:2011-12-03 15:58:25

标签: java json jackson

我为我的类和代码提出了这个问题,但这次又出现了另一个错误: 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 
{

}

1 个答案:

答案 0 :(得分:1)

所以,一个解决方案(我觉得很难看)就是调整JsonSubTypes,使其看起来与C#端创建的相同:

@JsonSubTypes(
{
    @JsonSubTypes.Type(value = LoginRequest.class, name = "LoginRequest:#MyPackage.DataPackets"),
    @JsonSubTypes.Type(value = LoginRequestReply.class, name = "LoginRequestReply:#MyPackage.DataPackets")
})

我还没有找到更好的方法。