本文示範如何將包含混合資料類型的 JSON 陣列反序列化為強型別 C# 類別。 挑戰在於 JSON 的架構不一致,其中字典的值是未命名元素的陣列。
範例 JSON 如下圖所示:
<code class="language-json">{ "timestamp": 1473730993, "total_players": 945, "max_score": 8961474, "players": { "Player1Username": [ 121, "somestring", 679900, 5, 4497, "anotherString", "thirdString", "fourthString", 123, 22, "YetAnotherString"], "Player2Username": [ 886, "stillAstring", 1677, 1, 9876, "alwaysAstring", "thirdString", "fourthString", 876, 77, "string"] } }</code>
此解決方案使用 Newtonsoft.Json 和自訂轉換器 ObjectToArrayConverter<T>
將未命名陣列元素對應到 Player
類別中的屬性。 帶有 JsonProperty
參數的 Order
屬性對於根據數組元素的位置將數組元素正確地映射到類別屬性至關重要。
這是關鍵類別的簡化表示:
玩家類別:
<code class="language-csharp">[JsonConverter(typeof(ObjectToArrayConverter<Player>))] public class Player { [JsonProperty(Order = 1)] public int UniqueID { get; set; } [JsonProperty(Order = 2)] public string PlayerDescription { get; set; } // ... other properties ... }</code>
ObjectToArrayConverter<T>
類別(為簡潔起見省略了實作)處理轉換邏輯。 根物件 ScoreboardResults
被定義為保存整個 JSON 結構:
記分板結果類別:
<code class="language-csharp">public class ScoreboardResults { public int timestamp { get; set; } public int total_players { get; set; } public int max_score { get; set; } public Dictionary<string, Player> players { get; set; } }</code>
或者,DataContract
和 DataMember
屬性可以透過指定屬性的順序來實現類似的結果。 本文建議探索演示小提琴(此處未包含連結)以獲取完整的程式碼範例。 這種方法可以有效地將複雜、結構不一致的 JSON 資料反序列化為強型別 C# 物件。
以上是如何將混合資料的 JSON 陣列反序列化為強型別 C# 類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!