本文演示了如何将包含混合数据类型的 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中文网其他相关文章!