从嵌套的json对象获取键名

时间:2019-12-27 17:17:04

标签: c# json linq json.net

我是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
            }
         }
}
```

寻找结果:

site1, site2, ...

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

谢谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

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

然后,您可以简单地遍历IEnumerable<Jproperty>以获取属性的Name或从其下获取任何其他所需的内容。

要获取网站的部分。您可以使用以下代码。

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

输出:

site1
site2

答案 1 :(得分:0)

您对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);
}