将两个JToken同时添加到字典作为键/值对

时间:2017-07-18 06:30:10

标签: c# json json.net

我有一个包含以下信息的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并附加到列表中,但这样做效率不高而且太笨拙了。请帮忙。我非常感谢能得到的任何东西。提前谢谢!

1 个答案:

答案 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));
}

小提琴:https://dotnetfiddle.net/MxRqg6