如何从Dictionary <string,dynamic>Json DeserializeObject获取数据

问题描述

我已经使用Newtonsoft对动态Json进行了反序列化。 JSON是复杂且动态的。

{
"last_updated": " ","regions": {
"antarctica": {
        "name": "Antarctica","totals": [],"list": [
            "aq","bv","gs","tf","hm"
        ]
    },"world": {
        "name" : "","totals": {
            "confirmed": 250566,"daily_confirmed": 0,"recovered": 202098,"deaths": 35205,"daily_deaths": 0,"critical": 676,"tests": 7249844
        },"list": [
            {
                "country": "Italy","country_code": "it","state": "Lombardy","confirmed": 85775,"deaths": 15662,"critical": 231,"recovered": 231,"tests": 43442,"daily_confirmed": -1,"daily_deaths": -1
            },and so on ..
       

为克服数据类型问题,我使用了动态对象

        [JsonTypedExtensionData]
    public Dictionary<string,dynamic> items { get; set; }    

至此效果很好。现在,我试图从此动态词典中获取数据

var report = await GetCountryReport();
        Dictionary<string,dynamic> Dict = report.regions.results["world"].items;

我正在获取数据作为Dict Count(2)

[0] = {[list,{[ {"country": "Italy","confirmed": 4149,"deaths": 55,"recovered": 2916,"Incidence_Rate": "54.408517127144925","Case-Fatality_Ratio": "1.274822260357931","last_updated": "2020-08-10T22:30:32Z","...
[1] = {[totals,{{"confirmed": 20218306,"recovered": 12814226,"deaths": 737481,"critical": 64743,"tests": 370260493}}]}

如何从字典中获取每个元素的值,例如“ values.list.country”等??

Visual Studio debug - output

解决方法

您可以按照以下方式进行操作:

var list = Dict.Where(x => x.Key == "list").Select(x => x.Value).SingleOrDefault();
var data = ((JArray)list).Select(x => new
{
    country = (string)x["country"],state = (string)x["state"],confirmed = (int)x["confirmed"]
    //...other properties in list
}).ToList();

数据结构如下:

enter image description here

然后,您可以使用foreach循环获取指定值:

foreach(var x in data)
{
    var country = x.country;
    var state = x.state;
    var confirmed = x.confirmed;
}