【问题标题】:Add two JToken to dictionary as Key/Value pair simultaneously同时将两个 JToken 作为键/值对添加到字典中
【发布时间】:2017-12-22 20:51:39
【问题描述】:

我有一个包含这些信息的 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

我曾考虑过使用字符串拆分并附加到一个列表,但这几乎没有效率,而且太笨拙。请帮忙。我会非常感激我能得到的任何东西。提前谢谢!

【问题讨论】:

    标签: c# json json.net


    【解决方案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

    【讨论】:

    • 非常感谢!完美满足我的需要!
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多