首页 文章

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

提问于
浏览
0

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

  • 1

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

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

    我没有找到更好的方法 .

相关问题