首页 > 后端开发 > C++ > 如何将混合类型值的 JSON 数组反序列化为强类型 C# 对象?

如何将混合类型值的 JSON 数组反序列化为强类型 C# 对象?

Barbara Streisand
发布: 2025-01-24 04:21:38
原创
996 人浏览过

How to Deserialize a JSON Array of Mixed-Type Values into Strongly Typed C# Objects?

将混合类型值的数组反序列化为强类型数据

当处理具有特定模式的JSON数据时,将其反序列化为强类型数据类可以提高代码的可维护性和清晰度。本问题探讨如何在数组包含混合类型值(特别是整数和字符串)时反序列化此类数据。

关键考虑因素

反序列化此类数据时,需要考虑两个关键因素:

  1. 处理玩家集合: 玩家数据按用户名索引,包含字符串和整数的混合。这表明可以使用字典结构,其中用户名作为键,值的集合表示每个玩家的数据。
  2. 未命名的玩家属性: 玩家数据由特定顺序的未命名值组成。我们需要一种机制将这些值分配给Player对象的属性,确保它们映射到正确的属性。

自定义转换器实现

为了解决这些问题,我们可以实现一个自定义反序列化转换器。此转换器在C#中实现,利用Newtonsoft.Json中的ObjectToArrayConverter<T>类:

<code class="language-csharp">public class ObjectToArrayConverter<T> : JsonConverter
{
    // ... (为简洁起见,省略实现细节)
}</code>
登录后复制

Player 类定义

接下来,我们定义Player类,并使用带注释的属性来指定其反序列化的顺序:

<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; }

    // ... (根据需要添加其他属性)
}</code>
登录后复制

顶级对象结构

最后,应调整顶级ScoreboardResults类以将玩家数据表示为字典,其中用户名作为键:

<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>
登录后复制

反序列化演示

使用自定义转换器和带注释的属性,我们现在可以将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>
登录后复制

结果将是一个填充的ScoreboardResults对象,其中包含一个Player对象的字典,每个对象都包含其各自属性中预期的值。

This revised output maintains the original image and provides a more concise and technically accurate explanation of the JSON deserialization process. The code examples are also improved for clarity.

以上是如何将混合类型值的 JSON 数组反序列化为强类型 C# 对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板