从jarray中删除指定元素的问题

string jsonText = "[{\"a\": \"aaa\",\"b\": \"bbb\",\"c\": \"ccc\"},{\"a\": \"aa\",\"b\": \"bb\",\"c\": \"cc\"}]"; var mJObj = JArray.Parse(jsonText); //需求,删除列表里的a节点的值为\"aa\"的项 IList<JToken> _ILIST = new List<JToken>(); //存储需要删除的项 JArray _JARRAY = new JArray(); foreach (var ss in mJObj) //查找某个字段与值 { if ((((JObject)ss)["a"]).ToString() == "aa") { _ILIST.Add(ss); _JARRAY.Add(ss); Console.Write(_ILIST[0]); Console.Write(_ILIST[0].GetHashCode()); Console.Write("\r\n---------------------------\r\n"); Console.Write("\r\n---------------------------\r\n"); Console.Write(_JARRAY[0]); Console.Write(_JARRAY[0].GetHashCode()); Console.Write("\r\n---------------------------\r\n"); Console.Write("\r\n---------------------------\r\n"); Console.Write(mJObj[1].GetHashCode()); } } foreach (var item in _ILIST) //移除mJObj 有效 { mJObj.Remove(item); } foreach (var item in _JARRAY) //移除mJObj 无效 { mJObj.Remove(item); }
通过_ILIST删除是有效的。
通过_JARRAY删除是无效的。
感谢怪蜀黍(Q:390647417)的解惑~
因为mJObj是一个JArray,实现了 IList<JToken>, 所以这里的ss就是JToken类型,把它add到_ILIST这样一个List<JToken>里,非常适合。
|
但是你如果调用 _JARRAY.Add(ss), 把JToken加到JArray里,就会把这个JToken从原来它所属的JObject上“拆”下来,所以ss的Root在Add之后变了。
|
|
|
总结:不同对象的Add方法并不保证原来是啥样,加进去还是啥样。
加进去的对象。在类型,值,ToString(),GetHash值,Root等方面,可能或多或少存在不同的地方。
所以以后遇到这种“诡异”的情况的时候,第一时间要想到是Add出了问题
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单