【问题标题】:Get Key Name from nested json object从嵌套的 json 对象中获取键名
【发布时间】:2019-12-27 17:17:04
【问题描述】:

我是 C# 和 JSON 的新手,在获取嵌套 JSON 对象列表中的键名时需要一些帮助。键是动态的,所以我不一定知道键。

我尝试过的示例代码。

```
protected void test()
{
        var mystring = @"{
          ""zone1"": {
            ""sites"": {
              ""site1"": {
                ""to"": ""email1"", 
                ""subject"": ""subjecttxt"", 
                ""link"": ""somesite""
            },
            ""site2"": {
              ""to"": ""email1"", 
              ""subject"": ""subject"",
              ""link"": ""somesite""
            }
          }, 
          ""zone2"": {
            ""to"": ""email1"", 
            ""subject"": ""subject"", 
            ""link"": ""somelink""
          }}";
        var rss = JObject.Parse(mystring);

        foreach (var section in rss)
        {
            Console.Write(section.Key);
            IList<JToken> result = rss["zone1"]["sites"].Children().ToList();
            var zone = section.Key;
            var site = rss[zone]["sites"];
            foreach (var subsite in rss["zone1"]["sites"])
            {
                var subs = subsite.Parent.ToString();
                // some other code
            }
         }
}
```

寻找结果:

网站1, 站点2, ...

我可以让孩子们成为 IList,但要寻找类似于上面提到的“section.Key”的东西。

感谢您的帮助。

【问题讨论】:

    标签: c# json linq json.net


    【解决方案1】:

    我相信您正在寻找的是获取网站的属性。由于访问rss["zone1"]["sites"] 会返回JToken,因此您需要将其转换为JObject,然后使用Properties() 方法获取您需要的数据。

    var sites = ((JObject)rss["zone1"]["sites"]).Properties();
    

    然后您可以简单地遍历 IEnumerable&lt;Jproperty&gt; 以获取该属性的 Name 或您需要的任何其他内容。

    要获取站点的section.Key,可以使用以下代码。

    foreach(var site in (JObject)rss["zone1"]["sites"]) {
        Console.WriteLine(site.Key);
    }
    

    输出:

    site1
    site2
    

    【讨论】:

      【解决方案2】:

      您对JObject.Parse 的第一次调用已经完成了将字符串转换为结构化 JSON 对象的所有工作。当前接受的答案通过 (1) 将结构化 JSON 对象转换回字符串,然后 (2) 使用 JObject.Parse 重新解析它来重做部分工作。有一个更简单的方法。

      相反,您可以将存储在rss["zone1"]["sites"] 的值转换为JObject。 (表达式rss["zone1"]["sites"] 的类型为JToken,它是JObject 的父类,但在这种情况下,我们碰巧知道rss["zone1"]["sites"] 始终是JSON 对象,即键值对的集合。因此,这个演员表是安全的。)

      这可能是代码的样子:

      var sites = (JObject) rss["zone1"]["sites"];
      foreach (var site in sites)
      {
        Console.WriteLine(site.Key);
      }
      

      【讨论】:

      • 请参阅此答案以了解 JSON.NET 的类层次结构:stackoverflow.com/a/38560188/8201661。当您有一个JToken 类型的变量,但您知道存储在该值中的值是JObject(或JArrayJProperty...)时,将该变量转换为@987654335 是安全的@(或JArrayJProperty...),以便您可以访问更具体的字段和方法。
      • 这个解决方案看起来确实更干净。令我惊讶的是它是多么简单,但却一直在努力。不知道我会如何接受这一点而不从先前的答案中拿走信用 - 因为它回答了这个问题。
      猜你喜欢
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 2020-02-24
      • 1970-01-01
      相关资源
      最近更新 更多