首頁 > 後端開發 > C++ > 如何使用JSON.NET進行類型信息的情況下進行序列化多態性JSON?

如何使用JSON.NET進行類型信息的情況下進行序列化多態性JSON?

DDD
發布: 2025-02-02 11:56:10
原創
147 人瀏覽過

How to Deserialize Polymorphic JSON Without Type Information Using JSON.NET?

無需類型信息使用JSON.NET反序列化多態JSON類

Json.NET是一個功能強大的.NET JSON序列化和反序列化庫。但是,當序列化數據中沒有類型信息時,反序列化多態JSON可能具有挑戰性。

問題:缺少類型信息

多態性允許多個類繼承自一個公共基類。當反序列化表示多態對象的JSON數據時,如果沒有類型信息,很難確定應該實例化哪個類。

例如,考慮以下JSON數據,它表示Gallery Image或Gallery Album類:

<code class="language-json">{
    "id": "OUHDm",
    "title": "My most recent drawing. Spent over 100 hours.",
    "is_album": false
}</code>
登入後複製

"is_album"屬性區分這兩個類。 Gallery Images的"is_album"設置為false,而Gallery Albums設置為true。

解決方案:自定義JsonConverter

要反序列化這種多態JSON,您可以創建一個自定義JsonConverter來處理對象實例化。轉換器檢查"is_album"屬性並創建相應的類實例。

這是一個名為GalleryItemConverter的示例轉換器:

<code class="language-csharp">public class GalleryItemConverter : JsonConverter
{
    // 指定转换器可以转换GalleryItem及其派生类
    public override bool CanConvert(Type objectType) => typeof(GalleryItem).IsAssignableFrom(objectType);

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 将JSON读取为JObject
        JObject jo = JObject.Load(reader);

        // 检查"is_album"属性以确定类类型
        bool? isAlbum = (bool?)jo["is_album"];

        GalleryItem item;
        if (isAlbum.GetValueOrDefault())
            item = new GalleryAlbum();
        else
            item = new GalleryImage();

        // 从JSON数据填充项目属性
        serializer.Populate(jo.CreateReader(), item);

        return item;
    }
}</code>
登入後複製

與JSON.NET反序列化的用法

要使用轉換器,請將其作為參數包含在默認JSON.NET反序列化器中,如下所示:

<code class="language-csharp">var items = JsonConvert.DeserializeObject<List<GalleryItem>>(json, new GalleryItemConverter());</code>
登入後複製

示例輸出

使用提供的JSON數據和自定義轉換器,您可以獲得反序列化的GalleryItem對象:

<code class="language-csharp">// Gallery Image
Console.WriteLine("ID: {0}, Title: {1}, Link: {2}", items[0].id, items[0].title, items[0].link);

// Gallery Album
Console.WriteLine("ID: {0}, Title: {1}, Link: {2}, Images: {3}", items[1].id, items[1].title, items[1].link, items[1].images.Count);</code>
登入後複製

以上是如何使用JSON.NET進行類型信息的情況下進行序列化多態性JSON?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板