如何检查指定字符串是否存在于JArray的JValue集合中
解决JArray中检查字符串是否存在的问题
嘿,我懂你这问题!直接拿字符串跟JValue比肯定不对,一个是原生字符串类型,一个是JSON.NET的封装类型,类型不匹配嘛,结果自然是false。至于转JValue报错,估计是你构造JValue的姿势不对,别急,给你几个实用的解决办法:
方案1:提取JValue的字符串值进行对比
这是最直接省心的方式——把每个JValue内部的字符串值取出来,再和目标字符串做比较。JSON.NET提供了两种便捷的取值方式:
- 使用
Value<string>()方法:
// 假设你已经解析得到了目标JArray JArray yourJArray = JArray.Parse(yourJsonContent); string targetString = "你要检查的字符串"; // 一行代码判断是否存在 bool isExists = yourJArray.Any(jValue => jValue.Value<string>() == targetString);
- 直接强制类型转换(JSON.NET支持隐式转换,用起来更简洁):
bool isExists = yourJArray.Any(jValue => (string)jValue == targetString);
如果担心JArray里混有非字符串类型的JValue(比如数字、布尔值),可以先判断类型再对比,避免转换报错:
bool isExists = yourJArray.Any(jValue => jValue.Type == JTokenType.String && (string)jValue == targetString);
方案2:构造正确的JValue对象来对比
如果你想用Contains方法来检查存在性,那得构造一个和目标字符串对应的JValue对象——别直接把字符串强转成JValue(这就是你之前报错的核心原因)。正确的构造方式是用JValue的构造函数或者CreateString静态方法:
JValue targetJValue = new JValue(targetString); // 也可以用 JValue.CreateString(targetString); bool isExists = yourJArray.Contains(targetJValue);
这里要说明下:JValue的Equals方法是按内部存储的值来比较的,只要两个JValue的内部值相同,就会返回true,所以用Contains完全可行。
为什么直接对比会失败?
本质就是类型不匹配:string是.NET原生的引用类型(行为类似值类型),而JValue是JSON.NET定义的封装类。直接用==对比时,编译器会判断类型不同,直接返回false;就算用Equals方法,默认的对象Equals是比较引用,JValue的Equals只和另一个JValue比较值,和字符串对比自然不匹配。
内容的提问来源于stack exchange,提问作者thatOneGuy
相关产品推荐
相关产品推荐

