如何迭代动态对象

How to iterate over dynamic objects

我正在使用 newtonsoft json 要读取带有测试的文件,我将其放入动态对象中。 这对静态配置部分很有效 然而,测试部分由测试组成,其语法不那么静态。 有些项目可能不同。

所以我的 json 文件 test.json 看起来很像:(缩短)

{"config":{"user":"Nico",userID:"54"},
 "tests":[ {"ask":"test1","handshake":false},
           {"ask":"test2","handshake":false},
           {"ask":"test3","handshake":true,"verify":"true"}
           {"ask":"test4","handshake":false},
           {"send":"result4"} 
           {"ask":"test7","repeat":30,"delay":120,"brakefail":false} ] 
 }

我将其转换为动态对象,读取配置部分效果很好:

dynamic testfile = JObject.Parse(File.ReadAllText( "c:\test.json"));
Console.WriteLine (testfile.config.user);
Console.Writeline (testfile.config.userID);  //this works

但现在我想知道迭代测试的语法是什么?
由于它们在选项、如何解析它们方面可能略有不同。 (测试经常变高)。

tests 是一个 JArray。您可以使用简单的 foreach

迭代测试
foreach(JObject test in testfile.tests)
{
    if(test.ContainsKey("ask"))
        Console.WriteLine(test.GetValue("ask"));
}

但你需要验证是否存在像“ask”这样的变量

JObject.Parse() returns 一个 JObject 类型,可以使用任何有效的字符串键进行索引,例如 'tests' 在您的情况下。然后就可以使用返回值,类型为JToken,来枚举items。

这是一个例子:

var jObject = JObject.Parse("{\"tests\":[{\"name\":\"Hana\"},{\"name\":\"Nita\"}]}");
foreach (var item in jObject["tests"])
            Console.WriteLine(item["name"]);