c# - 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());
答案不可能是我必须制作一个自定义播放器类然后使用它?
打开任何建议。谢谢你。
解决方案
这是获取playerid和playername的单行代码List
或Dictionary
//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);
推荐阅读
- python - 功能修改原图
- python - 无法安装lxml
- python - python的初学者问题:如何在python的文件中制作一个分隔行列表
- php - 在 Woocommerce 中按星级 ASC 添加产品排序选项
- .net-core - Windows 和 Linux 上的 Net Core Worker 服务
- c++ - Qt C++ 是静态thread_local QNetworkAccessManager 线程应用程序的好选择吗?
- python - 从 Python 中的两个数据数组中检测模式
- java - 数据库访问和模型在内存中的存储
- python-3.x - 如何根据熊猫中的多个条件返回布尔系列?
- java - Kafka 配置未在 Spring Boot 中从 Spring 配置服务器加载