2017-07-18 47 views
1

我有一個包含這些信息的JSON文件:添加兩個JToken到字典作爲鍵/值對同時

{ 
"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循環中檢索它們?

我失敗嘗試使用一些JToken性質上我Newtonsoft的文檔網站上找到:http://www.newtonsoft.com/json/help/html/Properties_T_Newtonsoft_Json_Linq_JToken.htm

我曾經想過用字符串分割,並追加到一個列表中,但幾乎沒有有效的和過於笨拙。請幫忙。我非常感謝我能得到的任何東西。先謝謝你!

回答

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

+0

非常感謝您!爲我所需要的完美工作! –

+0

沒問題;很高興我能幫上忙。 –

+1

如果你遇到了麻煩,你應該[提出一個新問題](https://stackoverflow.com/questions/ask),詳細描述你到底有什麼問題,你到底做了什麼,你期望得到什麼結果以及什麼結果你目前正在得到的結果。 (如果需要提供上下文,您可以鏈接回這個問題/答案。)評論不是提出新問題的好地方,因爲它們的長度和格式受到限制,並且某人(除了我)不太可能會看到它。除此之外,你發佈的小提琴鏈接與我的相同;它沒有你的改變/註釋。 –