C#中如何动态修改JSON数组指定元素的特定值?
遍历JSON并修改特定元素,同时保留原有内容的解决方案
当然可以在遍历过程中修改特定值,写完后完整保留其他原有内容!不需要调整JSON结构也能搞定,不过我也会给你提个结构优化的小建议,让后续操作更顺手。
现有结构下的实现方法
你当前用dynamic反序列化的方式完全可行,只需要在遍历的时候判断CheckName,匹配到目标就修改对应的Times值,最后序列化回文件即可。其他未匹配的元素会原封不动保留。
示例代码如下:
string configPath = @"C:\Scripts\Config.json"; // 读取JSON文件内容 string configContent = File.ReadAllText(configPath); // 反序列化为dynamic对象 dynamic configFile = JsonConvert.DeserializeObject(configContent); // 遍历每个元素,修改目标值 foreach (var item in configFile) { if (item.CheckName == "test2") { // 修改test2对应的第一个时间值,这里用当前时间做示例,你可以替换成需要的时间字符串 item.Times[0] = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffffff"); } else if (item.CheckName == "test") { // 修改test对应的第一个时间值 item.Times[0] = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffffff"); } // 其他元素不做修改,自动保留原有内容 } // 序列化回JSON,用Formatting.Indented保证输出格式美观,和原文件结构一致 string updatedConfig = JsonConvert.SerializeObject(configFile, Formatting.Indented); // 将修改后的内容写回磁盘 File.WriteAllText(configPath, updatedConfig);
结构优化建议(可选)
如果后续需要频繁通过CheckName定位元素(尤其是元素数量达到50+的时候),把JSON结构从数组改成以CheckName为键的对象会更高效,不需要每次都遍历整个集合。
调整后的JSON结构示例:
{ "test2": { "Times": [ "0001-01-01T00:00:00", "2019-02-27T09:29:39.5654213" ] }, "test": { "Times": [ "0001-01-01T00:00:00", "2019-02-27T09:29:39.574397" ] } }
对应的修改代码会更简洁,直接通过键访问目标元素:
string configPath = @"C:\Scripts\Config.json"; string configContent = File.ReadAllText(configPath); dynamic configFile = JsonConvert.DeserializeObject(configContent); // 直接定位test2修改,无需遍历 configFile.test2.Times[0] = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffffff"); // 直接定位test修改 configFile.test.Times[0] = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffffff"); // 序列化并写回文件 string updatedConfig = JsonConvert.SerializeObject(configFile, Formatting.Indented); File.WriteAllText(configPath, updatedConfig);
这个优化能大幅提升定位元素的效率,不过前提是你有权限修改JSON文件的结构。如果不能修改结构,第一种遍历修改的方式完全能满足需求。
内容的提问来源于stack exchange,提问作者Lewis Smith
相关产品推荐
相关产品推荐

