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中文網其他相關文章!