C#如何批量更新JArray中is_closed=false项的属性值
问题根因
你的代码修改不生效和ReplaceAll方法没有关系,核心是两个错误:
- 调用
o.ToObject<JObject>()时会生成原JToken的深拷贝副本,后续所有修改都是在脱离原数组的副本上操作,根本不会同步到原jaOppty对象 - 循环体内引用了未定义的变量
chat,属于笔误,即使副本修改逻辑正常,这里运行时也会直接抛出异常
正确实现方案
首先引入操作Json.NET所需的命名空间:
using Newtonsoft.Json.Linq;
直接遍历原JArray内的对象引用修改即可,不需要做额外的对象转换或者替换操作:
foreach (JObject opptyItem in jaOppty) { // 增加空值和类型校验,避免某一项缺失extras节点或is_closed字段时抛出空引用错误 if (opptyItem["extras"] is JObject extras && extras["is_closed"]?.Value<bool>() == false) { extras["is_closed"] = true; // 如果需要指定时间格式,可以传入格式化字符串,例:DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") extras["closed_dt"] = JToken.FromObject(DateTime.Now); } }
执行完上述逻辑后,原jaOppty中所有extras.is_closed = false的项都会被直接更新,直接序列化数组就能看到修改后的结果。
内容的提问来源于stack exchange,提问作者Dondon510
相关产品推荐
相关产品推荐

