【问题标题】:How do I create a C# dictionary from a json array of named lists? [closed]如何从命名列表的 json 数组创建 C# 字典? [关闭]
【发布时间】:2020-11-17 06:50:03
【问题描述】:

我有一个如下所示的文件:

{
  "Type1":
    [
      "Value1",
      "Value2",
      "Value5"
    ],
  "Type2":
    [
      "Value4",
      "Value6",
      "Value8"
    ],
  "Type3":
    [
      "Value7",
      "Value3"
    ]
}

我想将其转换为某种反向字典,因此生成的字典如下所示:

<Value1,Type1>
<Value2,Type1>
<Value3,Type3>
<Value4,Type2>
<Value5,Type1>
<Value6,Type2>
<Value7,Type2>
<Value8,Type3>

最终目标是能够获取任意给定值的类型(都是字符串类型)。我将通过服务请求获取该值,并且我需要获取其类型以进行处理。

这是我目前所拥有的,但看起来很笨拙——我的 JSON 解析技能有点生疏......

  public Dictionary<string, string> BuildValueMap(string pathToJson)
  {
     var jObj = LoadJsonFile(pathToJson);

     var valueMap = new Dictionary<string, string>();
     foreach (var node in jObj.Properties())
     {
        var type = node.Name;
        foreach (string value in node.Value)
        {
           valueMap.Add(value, type);
        }
     }
     return valueMap;
  }

  private static dynamic LoadJsonFile(string pathToJson)
  {
     using (StreamReader r = new StreamReader(pathToJson))
     {
        var json = r.ReadToEnd();
        return JsonConvert.DeserializeObject(json);
     }
  }

有没有更简单/更简洁/更简洁/整体更好的方法来做到这一点? TIA 提供任何和所有想法和建议!!

【问题讨论】:

  • 你有什么,工作正常,对吧?您可以使用 Linq 使其不那么冗长并且可能更不可读,这就是您想要的吗?根据help center,这可能与基于意见的审查或代码审查接壤。你能更具体地说明你想要什么吗?
  • 例如,您可以使用dynamic jObj = JsonConvert.DeserializeObject(File.ReadAllText(pathToJson)) 删除 9 行。但是这样的建议更适合Code Review
  • 感谢 cmets,我只是有点不确定这是否是执行转换的正确方法,而且我在任何地方都找不到示例。从目前的反应来看,我可能不会改变它......

标签: c# json parsing json.net


【解决方案1】:

您可以反序列化为Dictionary&lt;string, List&lt;string&gt;&gt; 并使用LINQ 处理结果:

var valueMap = JsonConvert.DeserializeObject<Dictionary<string, List<string>>>(json)
    .SelectMany(kvp => kvp.Value.Select(NewKey => (NewKey, kvp.Key)))
    .ToDictionary(t => t.NewKey, t => t.Key)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 2021-09-08
    • 2020-07-29
    • 1970-01-01
    • 2020-02-02
    • 2019-12-24
    • 2019-06-02
    相关资源
    最近更新 更多