为何JArray.Contains方法始终返回false?我的代码存在什么问题?
为什么JArray.Contains总是返回false?
嘿,这个问题我之前踩过坑!咱们来唠唠为啥会这样以及怎么解决~
核心原因:引用相等 vs 值相等
Newtonsoft.Json里的JArray.Contains()方法,默认用的是引用相等比较,而不是你预期的「值相等」。也就是说,它只会检查你传入的对象是不是数组里某个元素的同一个实例,而不是看两者的内容是否一样。
来拆解你代码里的两种情况:
- 直接传字符串
"abc":JArray解析出来的元素是JValue类型的对象,你传的是string类型,连类型都不一样,肯定返回false。 - 传
(JToken)"abc":你手动创建的这个JValue实例,和JArray里解析出来的那个"abc"的JValue实例是两个完全独立的对象,内存引用不同,所以Contains依然不认。
解决方案:用值比较替代引用比较
要判断数组里是否存在某个值的元素,咱们得换个方式,比如用LINQ的Any()方法结合值比较:
修正后的代码示例
var array = JArray.Parse("['abc', 'aaa']"); // 方式1:直接将JToken转为字符串比较 Console.WriteLine("1: " + array.Any(x => x.ToString() == "abc")); // true // 方式2:用JToken.DeepEquals做深度值比较(适合复杂嵌套结构) Console.WriteLine("2: " + array.Any(x => JToken.DeepEquals(x, JToken.Parse("abc")))); // true // 方式3:如果确定元素是字符串类型,直接强转后比较 Console.WriteLine("3: " + array.Any(x => (string)x == "abc")); // true
这几种方式都能正确判断数组里是否存在值为"abc"的元素,选哪种看你的实际场景就行~
内容的提问来源于stack exchange,提问作者awpyix
相关产品推荐
相关产品推荐

