首頁 >後端開發 >C++ >如何在 JSON.NET 中使用可選數組和物件反序列化 JSON?

如何在 JSON.NET 中使用可選數組和物件反序列化 JSON?

Patricia Arquette
Patricia Arquette原創
2025-01-12 19:07:44279瀏覽

How to Deserialize JSON with Optional Arrays and Objects in JSON.NET?

處理JSON.NET中可選數組和物件的反序列​​化

使用JSON.NET函式庫處理Facebook傳回的資料時,可能會遇到JSON結構變化的情況。某些屬性有時表示為數組,有時表示為物件。這會導致反序列化問題。

問題

某些Facebook貼文可能會傳回以下格式的JSON,這會導致反序列化失敗:

<code class="language-json">"attachment": {
    "media":{},
    "name":"",
    "caption":"",
    "description":"",
    "properties":{},
    "icon":"http://www.facebook.com/images/icons/mobile_app.gif",
    "fb_object_type":""
},
"permalink":"http://www.facebook.com/1234"</code>

為了解決這個問題,可以使用JsonConverter類別實作自訂JSON轉換器。此轉換器將處理特定屬性的陣列和物件結構。

自訂JSON轉換器

以下自訂轉換器SingleValueArrayConverter將單一物件轉換為列表,允許正確反序列化屬性:

<code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        object retVal;
        if (reader.TokenType == JsonToken.StartObject)
        {
            T instance = (T)serializer.Deserialize(reader, typeof(T));
            retVal = new List<T>() { instance };
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            retVal = serializer.Deserialize(reader, objectType);
        }
        else
        {
            retVal = null; // 处理其他情况,例如空值
        }
        return retVal;
    }

    public override bool CanConvert(Type objectType)
    {
        return true;
    }
}</code>

用法

要使用自訂轉換器,請使用JsonConverter屬性註解目標類別中的屬性:

<code class="language-csharp">[JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))]
public List<OrderItem> Items { get; set; }</code>

這將允許JSON.NET處理Items屬性的陣列和物件結構,從而解決反序列化問題。 注意添加了get; set; 以及對else情況的處理,使其更加健壯。

以上是如何在 JSON.NET 中使用可選數組和物件反序列化 JSON?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn