如何读取JArray对象并修改后写入JSON文件?截取from字段更新To值
问题解决方案
问题描述
需要修改JSON文件中Bots数组内每个对象的To字段,将其替换为对应from字段第一个斜杠后的全部内容。使用Newtonsoft.Json时遇到两个问题:无法通过Split('/')[1]获取目标值,且无法将修改后的内容写回原文件。
原JSON结构
{"Name":"M","Age":"2","Bots":[{"from":"D/2334/23","To":"02-04-2023"},{"from":"E/2s/1","To":"03-04-2023"},{"from":"ESS/5sB/DS","To":"03-04-2023"}]}
期望修改后的Bots数组
"Bots":[{"from":"D/2334/23","To":"2334/23"},{"from":"E/2s/1","To":"2s/1"},{"from":"ESS/5sB/DS","To":"5sB/DS"}]
用户尝试的代码
string json = File.ReadAllText("settings.json"); dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject(json); jsonObj["Bots"][0]["To"] = jsonObj["Bots"][0]["from"].split('/')[1];
问题分析与解决步骤
- dynamic类型处理问题:
dynamic对象的from字段需先转换为string类型才能调用字符串方法,且C#中方法名首字母需大写(应为Split而非split)。 - 取值逻辑错误:
Split('/')[1]仅能获取第一个斜杠后的第一个分段,无法得到后续所有内容,正确做法是找到第一个斜杠的位置,截取其后的全部字符串。 - 未遍历数组:原代码仅修改了
Bots数组的第一个元素,需遍历所有元素完成批量修改。 - 缺少写回文件步骤:修改完成后需将对象重新序列化为JSON字符串,再写入原文件。
完整正确代码
using Newtonsoft.Json; using System.IO; // 读取JSON文件 string jsonPath = "settings.json"; string jsonContent = File.ReadAllText(jsonPath); // 反序列化为dynamic对象 dynamic jsonObj = JsonConvert.DeserializeObject(jsonContent); // 遍历Bots数组,修改每个对象的To字段 foreach (var bot in jsonObj.Bots) { string fromValue = bot.from.ToString(); int firstSlashIndex = fromValue.IndexOf('/'); if (firstSlashIndex != -1) { bot.To = fromValue.Substring(firstSlashIndex + 1); } // 可选:如果from字段没有斜杠,可设置默认值或跳过 // else { bot.To = fromValue; } } // 将修改后的对象序列化为格式化的JSON字符串(也可使用Formatting.None输出紧凑格式) string updatedJson = JsonConvert.SerializeObject(jsonObj, Formatting.Indented); // 写回原文件 File.WriteAllText(jsonPath, updatedJson);
代码说明
- 使用
IndexOf('/')定位第一个斜杠的位置,通过Substring截取后续全部内容,确保符合需求。 - 遍历
Bots数组实现批量修改,避免仅修改单个元素。 - 最后通过
File.WriteAllText将修改后的JSON写回原文件,完成整个流程。
内容的提问来源于stack exchange,提问作者Mahendran V M
相关产品推荐
相关产品推荐

