You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:17:36