【问题标题】:Deserialize JSON string generated from .NET using Jackson使用 Jackson 反序列化从 .NET 生成的 JSON 字符串
【发布时间】:2012-01-12 05:21:00
【问题描述】:

我参考this question 获取我的类和代码,但这次出现了另一个错误。

自从上述问题以来,我已经向 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,"用户名":"User1"}}

请注意上面 JSON 中的 __type。这是 .NET 为跟踪“SubPacket”是什么类型的对象而创建的。

问题是如何在 Java 端使用 Jackson 反序列化它?

它给了我以下错误:

org.codehaus.jackson.map.JsonMappingException:无法解析类型 id 'LoginRequestReply:#MyPackage.DataPackets' 变成一个子类型 [简单类型,类 MyPackage.DataPacket] 在 [Source: 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 
{
    
}

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

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

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

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

    【讨论】:

    • 我不明白这有什么丑陋的。在我看来,JSON 中的类型名称映射到 Java 目标类型的名称。更清洁的解决方案是什么样的?
    猜你喜欢
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2013-07-16
    相关资源
    最近更新 更多