首頁 >後端開發 >C++ >如何使用自訂 JsonConverter 在 C# 中反序列化混合 JSON 陣列和物件?

如何使用自訂 JsonConverter 在 C# 中反序列化混合 JSON 陣列和物件?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-12 19:22:46569瀏覽

How Can I Deserialize Mixed JSON Arrays and Objects in C# Using a Custom JsonConverter?

混合 JSON 陣列和物件的 C# 反序列化

本文解決了從 Facebook 等來源反序列化 JSON 資料的挑戰,其中資料結構可能不一致地顯示為陣列或物件。 標準 JSON.NET 反序列化在這種情況下通常會失敗。

解決方案:自訂 JsonConverter

解決方案涉及建立自訂 JSON.NET 轉換器。 此轉換器可以處理陣列和物件格式,確保反序列化的一致性。 (有關更詳細的說明,請參閱「使用自訂 JsonConverter 修復錯誤的 JSON 結果」。)

實作自訂轉換器

此解決方案的核心是自訂轉換器,即使輸入 JSON 是單一對象,它也會傳回目標類型的清單。

  1. 屬性屬性:

    C# 類別中保存反序列化資料的屬性需要使用自訂轉換器進行註解:

    <code class="language-csharp">[JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))]
    public List<OrderItem> Items;</code>
  2. SingleValueArrayConverter班級:

    此自訂轉換器檢查 JSON 令牌類型並適當反序列化:

    <code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException(); // Not implemented for this example
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.StartObject)
            {
                T instance = (T)serializer.Deserialize(reader, typeof(T));
                return new List<T> { instance };
            }
            else if (reader.TokenType == JsonToken.StartArray)
            {
                return serializer.Deserialize(reader, objectType);
            }
            return null; // Handle other token types as needed
        }
    
        public override bool CanConvert(Type objectType)
        {
            return true; // Or add specific type checking here for robustness
        }
    }</code>

此轉換器確保無論 JSON 輸入是單一物件還是數組,產生的 C# 屬性都將始終包含 List<T>。 請注意,可能需要新增錯誤處理(例如,針對意外的令牌類型)以供生產使用。 當列表是適合單物件和陣列 JSON 輸入的資料結構時,此方法特別有用。 對於清單不合適的情況,可能需要替代解決方案。

以上是如何使用自訂 JsonConverter 在 C# 中反序列化混合 JSON 陣列和物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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