如何使用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
相关产品推荐
相关产品推荐

