我有一个包含以下信息的json文件:
{
"type" : "Something",
"values" :
[
{ "type": "Something else",
"categories": {
"values": [ "Grocery" ]},
"Name": "Eggs"
},
{ "type": "Something else",
"categories": {
"values": [ "Utensil" ]},
"Name": "Spoon"
}
]}
我像这样解析它
string jstring = File.ReadAlltext(jsonFile);
JObject json = JObject.Parse(jstring);
现在我想只获取Name和CategoryValue,并使它们成为字典中的键/值对。所以我这样开始:
foreach (var item in json["values"]){
Console.WriteLine(item["categories"]["values"] + ":" + item["Name"]};
我得到了输出:
杂货:鸡蛋
用具:勺子
我的问题:当我在foreach循环中检索这些信息时,直接将这些信息添加到字典中的最有效方法是什么?
我尝试使用我在Newtonsoft的文档网站上找到的一些JToken属性时失败了:http://www.newtonsoft.com/json/help/html/Properties_T_Newtonsoft_Json_Linq_JToken.htm
我已经考虑过使用String Split并附加到列表中,但这样做效率不高而且太笨拙了。请帮忙。我非常感谢能得到的任何东西。提前谢谢!
答案 0 :(得分:1)
我假设每个项目可能有多个类别,并且相同的类别可以出现在多个项目上?在这种情况下,您希望字典为Dictionary<string, List<string>>
,其中键是类别,值是该类别下所有项目的列表。您可以使用LINQ方法创建此字典:
Dictionary<string, List<string>> dict = obj["values"]
.Select(jo => jo.SelectToken("categories.values")
.Select(t => new
{
Category = (string)t,
Name = (string)jo["Name"]
}))
.SelectMany(a => a)
.GroupBy(a => a.Category)
.ToDictionary(g => g.Key, g => g.Select(a => a.Name).ToList());
然后:
foreach (var kvp in dict)
{
Console.WriteLine(kvp.Key + ": " + string.Join(", ", kvp.Value));
}