You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JSON.NET将含动态键名的JSON反序列化为C#数组对象

解决方案:反序列化动态键JSON为Player数组

当然可以解决这个问题!这种以动态ID作为顶级键的JSON结构确实有点反常规,但用JSON.NET(Newtonsoft.Json)处理起来非常顺手,有两种简单的方案供你选择:

方案1:用Dictionary中转(最直接)

这种方法不需要额外写转换器,利用JSON.NET对Dictionary的原生支持即可:

1. 定义Player实体类

先对应JSON内部的对象结构定义C#类,如果你习惯C#的PascalCase命名规范,可以用[JsonProperty]特性映射JSON的蛇形键:

public class Player
{
    [JsonProperty("player_id")]
    public int PlayerId { get; set; }

    [JsonProperty("prop1")]
    public string Prop1 { get; set; }

    [JsonProperty("prop2")]
    public string Prop2 { get; set; } // 支持null值,因为JSON里该字段可能为null

    [JsonProperty("prop3")]
    public string Prop3 { get; set; }
}

如果不在意命名风格,直接用和JSON一致的蛇形命名也可以,比如public int player_id { get; set; }。

2. 反序列化并转换为数组

因为顶级JSON是“动态ID键 + Player对象”的键值对结构,我们可以先反序列化为Dictionary<string, Player>,再提取字典的Values集合转成数组:

// 你的示例JSON字符串
string json = @"{""5131"": { ""player_id"": 5131, ""prop1"": ""val1"", ""prop2"": null, ""prop3"": ""val3"" }, ""5132"": { ""player_id"": 5132, ""prop1"": ""val1"", ""prop2"": null, ""prop3"": ""val3"" }}";

// 第一步:反序列化为字典
var playerDict = JsonConvert.DeserializeObject<Dictionary<string, Player>>(json);

// 第二步:提取所有Player对象转为数组
Player[] playersArray = playerDict.Values.ToArray();
// 或者转为List<Player>,根据你的需求选择
List<Player> playersList = playerDict.Values.ToList();

这样得到的playersArray就是你想要的纯数据项数组,完全没有保留那些动态的ID键。

方案2:自定义JsonConverter(适合重复使用场景)

如果你需要多次处理这种结构的JSON,写一个自定义转换器可以让反序列化更简洁,不需要每次手动转字典:

1. 实现自定义转换器

public class PlayerListConverter : JsonConverter<List<Player>>
{
    public override List<Player> ReadJson(JsonReader reader, Type objectType, List<Player> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        // 先把JSON读为字典,再转成List
        var playerDict = serializer.Deserialize<Dictionary<string, Player>>(reader);
        return playerDict?.Values.ToList() ?? new List<Player>();
    }

    public override void WriteJson(JsonWriter writer, List<Player> value, JsonSerializer serializer)
    {
        // 如果需要把List<Player>序列回原JSON格式,可以实现这个方法
        var playerDict = value.ToDictionary(p => p.PlayerId.ToString(), p => p);
        serializer.Serialize(writer, playerDict);
    }
}

2. 使用转换器直接反序列化

List<Player> players = JsonConvert.DeserializeObject<List<Player>>(json, new PlayerListConverter());

这样就一步到位得到了Player列表,非常适合在项目中重复使用的场景。

注意事项

  • 确保Player类的属性和JSON字段完全匹配(大小写默认不敏感,但如果有特殊命名一定要用[JsonProperty]映射)
  • 如果JSON中的动态ID不是字符串类型(比如纯数字),Dictionary<string, Player>依然可以正常工作,因为JSON.NET会自动转换类型
  • 如果JSON可能为空,记得加判空处理,避免空引用异常

内容的提问来源于stack exchange,提问作者snappymcsnap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:47:33