首页 > 解决方案 > C# 将没有自定义类的 JSON 反序列化为 Dictionary 或 DataTable

问题描述

从 API 我得到一个像这样的 json:

一个玩家的 66 个结果,其中包含大约 31 个包含单个值或值数组的属性。

{"api":
{"results":66,
    "players":
        [{
            "player_id":10,
            "player_name":"Gustavo Ferrareis",
            ... (some 31 stats)
            "shots":{
                    "total":13,
                    "on":2
                },
            ...
          },
            "player_id":21,
            ...
       }]
     }

而且我想知道是否有一种方法可以将玩家集合反序列化为具有所有 31 个属性的字典或更好的 DataTable,而无需自定义玩家类或单独访问每个属性

到目前为止,我尝试通过以下方式访问玩家列表:

        var data = JObject.Parse(json);
        foreach (var field in data)
        {
            var data2 = JObject.Parse(field.Value.ToString());
            foreach (var field2 in data2)
            {
                if (field2.Key.ToString() == "players")
                {
                    dynamic array2 = JsonConvert.DeserializeObject(field2.Value.ToString());

                    foreach (var field3 in array2)
                        Console.WriteLine("Player_id: " + field3.player_id.ToString() + " - Player_name: " + field3.player_name.ToString());
                }
            }
        }

返回

Player_id: 10 - Player_name: Gustavo Ferrareis
Player_id: 22 - Player_name: Getúlio
Player_id: 22 - Player_name: Getúlio

我想像:

Dictionary<string, object> dict = new Dictionary<string, object>();

foreach (var player in array2)
    dict.Add(player.Key(), player.Value());

答案不可能是我必须制作一个自定义播放器类然后使用它?

打开任何建议。谢谢你。

标签: c#jsondeserializationjson-deserialization

解决方案


这是获取playerid和playername的单行代码ListDictionary

//To List
var resultToList = JObject.Parse(jsonstring)["api"]["players"]
                   .Select(p => (p["player_id"].ToString(), p["player_name"].ToString()))
                   .ToList();

//To Dictionary
var resultToDict = JObject.Parse(jsonstring)["api"]["players"]
                   .Select(p => (p["player_id"].ToString(), p["player_name"].ToString()))
                   .ToDictionary(x=>x.Item1, y=>y.Item2);

推荐阅读