混合 JSON 陣列和物件的 C# 反序列化
本文解決了從 Facebook 等來源反序列化 JSON 資料的挑戰,其中資料結構可能不一致地顯示為陣列或物件。 標準 JSON.NET 反序列化在這種情況下通常會失敗。
解決方案:自訂 JsonConverter
解決方案涉及建立自訂 JSON.NET 轉換器。 此轉換器可以處理陣列和物件格式,確保反序列化的一致性。 (有關更詳細的說明,請參閱「使用自訂 JsonConverter 修復錯誤的 JSON 結果」。)
實作自訂轉換器
此解決方案的核心是自訂轉換器,即使輸入 JSON 是單一對象,它也會傳回目標類型的清單。
屬性屬性:
C# 類別中保存反序列化資料的屬性需要使用自訂轉換器進行註解:
<code class="language-csharp">[JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))] public List<OrderItem> Items;</code>
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中文網其他相關文章!