简体   繁体   English

如何使用 Linq 将 JSON 文件中两个不同位置的数据转换为 C# 字典中的键(字符串)和值(双精度)?

[英]How to convert data from two different locations in JSON file to a key(string) and value(double) within a C# dictionary, using Linq?

I am currently trying to download data from the office for national statistics API. The JSON has the format:我目前正在尝试从国家统计局 API 下载数据。JSON 的格式为:

{
"@context": "https://cdn.ons.gov.uk/assets/json-ld/context.json",
"dimensions": {
    "geography": {
        "option": {
            "href": "https://api.beta.ons.gov.uk/v1/code-lists/nuts/codes/UKG",
            "id": "UKG"
        }
    },
    "growthrate": {
        "option": {
            "href": "https://api.beta.ons.gov.uk/v1/code-lists/quarterly-index-and-growth-rate/codes/gra",
            "id": "gra"
        }
    },
    "prices": {
        "option": {
            "href": "https://api.beta.ons.gov.uk/v1/code-lists/type-of-prices/codes/cvm",
            "id": "cvm"
        }
    },
    "time": {
        "option": {
            "href": "https://api.beta.ons.gov.uk/v1/code-lists/calendar-years/codes/2018",
            "id": "2018"
        }
    }
},
"limit": 10000,
"links": {
    "dataset_metadata": {
        "href": "https://api.beta.ons.gov.uk/v1/metadata"
    },
    "self": {
        "href": "https://api.beta.ons.gov.uk/v1/datasets/regional-gdp-by-year/editions/time-series/versions//observations?geography=UKG&growthrate=gra&prices=cvm&time=2018&unofficialstandardindustrialclassification=*"
    },
    "version": {
        "href": "https://api.beta.ons.gov.uk/v1"
    }
},
"observations": [
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/C",
                "id": "C",
                "label": "C : Manufacturing"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "0.4"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/O",
                "id": "O",
                "label": "O : Public administration and defence; compulsory social security"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "0.8"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/R",
                "id": "R",
                "label": "R : Arts, entertainment and recreation"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "2.4"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/P",
                "id": "P",
                "label": "P : Education"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "4.2"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/H",
                "id": "H",
                "label": "H : Transportation and storage"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "2.7"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/F",
                "id": "F",
                "label": "F : Construction"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "-0.8"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/K",
                "id": "K",
                "label": "K : Financial and insurance activities"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "3.5"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/M",
                "id": "M",
                "label": "M : Professional, scientific and technical activities"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "1.9"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/I",
                "id": "I",
                "label": "I : Accommodation and food service activities"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "-1.4"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/J",
                "id": "J",
                "label": "J : Information and communication"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "7.4"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/B--E",
                "id": "B--E",
                "label": "B-E : Production"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "0"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/L",
                "id": "L",
                "label": "L : Real estate activities"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "1.2"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/E",
                "id": "E",
                "label": "E : Water supply; sewerage, waste management and remediation activities"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "1.4"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/N",
                "id": "N",
                "label": "N : Administrative and support service activities"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "4.2"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/A--T",
                "id": "A--T",
                "label": "A-T : Total"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "2.1"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/G",
                "id": "G",
                "label": "G : Wholesale and retail trade; repair of motor vehicles and motorcycles"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "3.8"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/B",
                "id": "B",
                "label": "B : Mining and quarrying"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "8.3"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/A",
                "id": "A",
                "label": "A : Agriculture, forestry and fishing"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "-5.2"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/T",
                "id": "T",
                "label": "T : Activities of households as employers; undifferentiated goods and services-producing activities of households for own use"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "26.6"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/D",
                "id": "D",
                "label": "D : Electricity, gas, steam and air conditioning supply"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "-4.6"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/Q",
                "id": "Q",
                "label": "Q : Human health and social work activities"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "4.1"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/G--T",
                "id": "G--T",
                "label": "G-T : Services sector"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "3"
    },
    {
        "dimensions": {
            "UnofficialStandardIndustrialClassification": {
                "href": "https://api.beta.ons.gov.uk/v1/code-lists/sic-unofficial/codes/S",
                "id": "S",
                "label": "S : Other service activities"
            }
        },
        "metadata": {
            "Data Marking": ""
        },
        "observation": "2.4"
    }
],
"offset": 0,
"total_observations": 23

} }

The data I am trying to get out is the "label" as the string key and the "observation" as the double value.我要获取的数据是作为字符串键的“标签”和作为双精度值的“观察”。 I am then trying to save this within a dictionary.然后我试图将其保存在字典中。

The code I am currently using looks like this:我目前使用的代码如下所示:

UnityWebRequest www = UnityWebRequest.Get($"{baseUrl}observations?geography=UKG&growthrate=gra&prices=cvm&time={x}&unofficialstandardindustrialclassification=*");
            yield return www.SendWebRequest();
            if (www.result != UnityWebRequest.Result.Success)
            {
                Debug.Log(www.error);
            }
            else
            {

                OnsApiResult = www.downloadHandler.text;


                var observations = JObject.Parse(OnsApiResult)["observations"];
                var results = from data in observations
                              select
                                new { label = data["dimensions"]["UnofficialStandardIndustrialClassification"]["label"].ToObject<string>(), observation = data["observation"].ToObject<double>() };


                foreach (var item in results)
                {
                    thisYearData.Add(item.label, item.observation);
                }

the system works when I keep the information as an object, but when I try to convert the data to string and double, I get the error messages:当我将信息保存为 object 时系统工作,但是当我尝试将数据转换为字符串和双精度时,我收到错误消息:

"FormatException: Input string was not in a correct format." “FormatException:输入字符串的格式不正确。”

I am using newtonsoft.JSON, and System.Linq, I am also working on the Unity Game Engine.我正在使用 newtonsoft.JSON 和 System.Linq,我也在使用 Unity 游戏引擎。

Can someone please help me with this?有人可以帮我吗? Thank You.谢谢你。

I changed a little your code and it works ok for me我稍微更改了您的代码,对我来说没问题

    var observations = JObject.Parse(OnsApiResult)["observations"];
    var results = observations.Select( data => new {
        label = (string)data["dimensions"]["UnofficialStandardIndustrialClassification"]["label"],
        observation = (double)data["observation"]
        });

Your code is working fine in my side... maybe you have some error in your JSON....you can try the following imperative approach instead of LINQ to get more info about what happen你的代码在我这边运行良好......也许你的 JSON 有一些错误......你可以尝试以下命令式方法而不是 LINQ 来获取有关发生的事情的更多信息

foreach(var data in observations)
{
    string label = (string)data["dimensions"]["UnofficialStandardIndustrialClassification"]["label"];
    
    double observation = 0.0;
    if (!double.TryParse((string)data["observation"], out observation))
    {
        // the string observation can not convert to double 
        // log it 
        Console.Error.WriteLine($"ther is problem in json the the value '{data["observation"]}' can not be double");
        continue;
    }
    if (thisYearData.ContainsKey(label))
    {
        // your dictionary alredy has the value 
        Console.Error.WriteLine($"doublicat label : '{label}' alredy exist");
        continue;
    }
    thisYearData.Add(label, observation);    

}

Solved:解决了:

There was nothing wrong with my code.我的代码没有任何问题。 The data I was receiving for 2012 from the ONS was badly formatted.我从 ONS 收到的 2012 年数据格式错误。 I removed the 2012 from the data and it worked fine.我从数据中删除了 2012 年,它工作正常。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM