簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM