C# 使用JSON.Net反序列化JSON并测试数组内容

C# 使用JSON.Net反序列化JSON并测试数组内容,c#,json.net,C#,Json.net,我正在使用JSON.Net反序列化JSON,其思路与此问题的公认解决方案相同:。基本上: dynamic d = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}"); Console.WriteLine(d.number); Console.WriteLine(d.str); Console.WriteLine(d.array.Count); 区别在于我的数组有字符串而不是数字。上述方法效果良好。但是,我要做的

我正在使用JSON.Net反序列化JSON,其思路与此问题的公认解决方案相同:。基本上:

dynamic d = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}");

Console.WriteLine(d.number);
Console.WriteLine(d.str);
Console.WriteLine(d.array.Count);
区别在于我的数组有字符串而不是数字。上述方法效果良好。但是,我要做的是测试数组是否包含特定值。如果它是一个类型化的字符串数组,我可以使用myArray.IndexOf(“ValueToFind”),如果它返回一个值>-1,那么它就在那里。但是,这不起作用,我认为这是因为它实际上是一个jvalue数组,而不是字符串

我可以迭代数组,将每个数组转换为字符串,然后进行测试(即,内部带有if语句的foreach循环),但我希望使用更简洁的单行测试。有人能告诉我是否有更简单的方法来做这个测试吗


感谢

JSON.NET可以无缝地将
JArray
转换为
List
,因此您可以使用

Console.WriteLine(d.array.ToObject<List<string>>().IndexOf("1"));
Console.WriteLine(d.array.ToObject().IndexOf(“1”);

这甚至适用于JSON整数数组。

我得到了一个稍微混乱的答案,首先将动态数组转换为已知类型:

IEnumerable<JToken> d2 = d.array;

我懒得尝试这一点,但您不能使用扩展方法Any(),例如if(d.Any(p=>p.ToString()=“Whatever”){//etc..}谢谢,但不幸的是,我得到了这样一条消息:“如果不首先将lambda表达式强制转换为委托或表达式树类型,则无法将lambda表达式用作动态调度操作的参数”
if (d2.Any(p => p.ToString() == "1")) //etc.