首頁 > 後端開發 > C++ > 如何在反序列化過程中處理不明確的 JSON 陣列和物件?

如何在反序列化過程中處理不明確的 JSON 陣列和物件?

Barbara Streisand
發布: 2025-01-12 19:01:43
原創
524 人瀏覽過

How Can I Handle Ambiguous JSON Arrays and Objects During Deserialization?

JSON 反序列化:處理不明確的陣列與物件

在處理 JSON 資料時,常會遇到結構不一致的情況。某些屬性在一個實例中可能表示為數組,而在另一個實例中則表示為物件。這在反序列化過程中可能會導致問題,尤其是在使用類型安全類別時。

問題:

考慮 Facebook 回傳的以下 JSON 資料:

  • 牆面貼文(物件):

    <code class="language-json">  {
        "description": "",
        "permalink": "..."
      }</code>
    登入後複製
  • 照片貼文(陣列):

    <code class="language-json">  {
        "media": [
            {
                "href": "...",
                "src": "..."
            }
        ]
      }</code>
    登入後複製
  • 移動牆面貼文(物件):

    <code class="language-json">  {
        "name": null,
        "caption": null,
        "media": {}
      }</code>
    登入後複製

在移動牆面貼文的情況下,「media」屬性表示為空物件而不是陣列。當使用期望“FacebookMedia”物件數組的類別時,這種差異會導致反序列化失敗。

解決方案:自訂 JSON 轉換器

為了處理這種情況,我們可以建立一個自訂 JSON 轉換器。此轉換器將檢查 JSON 結構,並根據陣列或物件的存在傳回清單或 null。

<code class="language-csharp">public class FacebookMediaJsonConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.StartArray)
            return serializer.Deserialize<List<FacebookMedia>>(reader);
        else
            return null;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(List<FacebookMedia>);
    }
}</code>
登入後複製

用法:

要使用轉換器,請使用 [JsonConverter] 屬性註解類別中的屬性:

<code class="language-csharp">[JsonConverter(typeof(FacebookMediaJsonConverter))]
public List<FacebookMedia> Media { get; set; }</code>
登入後複製

現在,反序列化將成功處理「Media」屬性的陣列和物件。

針對單一物件的擴充:

如果您希望即使只有一個物件也能收到列表,則可以擴展轉換器以將單個物件轉換為列表。

<code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        object result;
        if (reader.TokenType == JsonToken.StartObject)
        {
            T instance = (T)serializer.Deserialize(reader, typeof(T));
            result = new List<T> { instance };
        }
        else if (reader.TokenType == JsonToken.StartArray)
        {
            result = serializer.Deserialize(reader, objectType);
        }
        else
        {
            throw new JsonSerializationException("Unexpected token type.");
        }
        return result;
    }

    // ... 转换器实现的其余部分 ...
}</code>
登入後複製

透過使用自訂 JSON 轉換器,我們可以處理 JSON 結構中的不一致性,並確保成功反序列化。

以上是如何在反序列化過程中處理不明確的 JSON 陣列和物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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