我是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”的东西。
谢谢您的帮助。
答案 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);
}