如何通过C#(NewtonSoft)程序化更新JSON数组及子层级属性?
使用NewtonSoft.Json在C#中程序化更新JSON数组与子属性
嘿,我来帮你搞定这个需求!结合你给出的JSON结构和技术环境(Visual Studio C# + NewtonSoft.Json),我整理了两种实用的实现方案,你可以根据项目需求灵活选择。
1. 先搞定依赖
首先确保你的项目已经安装了NewtonSoft.Json包,直接通过NuGet就能装:
- 对于传统.NET Framework,在NuGet包管理器控制台输入:
Install-Package Newtonsoft.Json - 对于.NET Core/.NET 5+,用CLI命令:
dotnet add package Newtonsoft.Json
2. 方案一:强类型实体类(推荐,类型更安全)
如果你的JSON结构相对固定,定义对应的实体类是最佳选择——编译时就能发现错误,后续维护也更方便。根据你的JSON示例,我们可以定义这些类:
public class DeviceConfig { public string model { get; set; } public string make { get; set; } public List<string> alias { get; set; } public Variables variables { get; set; } } public class Variables { public Temperature temperature { get; set; } } public class Temperature { public string dataType { get; set; } public Unit unit { get; set; } public int min { get; set; } public int max { get; set; } public string description { get; set; } } public class Unit { public string value { get; set; } public List<string> @enum { get; set; } // 因为enum是C#关键字,加个@避免语法冲突 }
接下来就是加载、更新、保存的完整流程:
using Newtonsoft.Json; using System.IO; // 1. 读取JSON文件内容 string jsonPath = @"你的JSON文件路径,比如C:\config.json"; string rawJson = File.ReadAllText(jsonPath); // 反序列化为强类型对象 DeviceConfig config = JsonConvert.DeserializeObject<DeviceConfig>(rawJson); // 2. 更新alias数组——这里给你几个常用操作示例 config.alias.Add("new_alias_01"); // 新增一个别名 config.alias.Remove("sample"); // 移除指定的别名元素 // 要是想直接替换整个数组也很简单: // config.alias = new List<string> { "alias_a", "alias_b", "alias_c" }; // 3. 更新子JSON属性——比如修改温度的最大值、单位和描述 config.variables.temperature.max = 350; // 把max从300改成350 config.variables.temperature.unit.value = "°F"; // 切换单位为华氏度 config.variables.temperature.description = "电机外部检测到的表层温度(已更新)"; // 修改描述文本 // 4. 序列化回JSON并保存到文件 string updatedJson = JsonConvert.SerializeObject(config, Formatting.Indented); File.WriteAllText(jsonPath, updatedJson);
3. 方案二:动态JObject(灵活,无需定义实体类)
如果你的JSON结构经常变动,或者不想写一堆实体类,用JObject动态处理就很方便:
using Newtonsoft.Json.Linq; using System.IO; // 1. 加载JSON为JObject string jsonPath = @"你的JSON文件路径"; JObject config = JObject.Parse(File.ReadAllText(jsonPath)); // 2. 更新alias数组 JArray aliasArray = (JArray)config["alias"]; aliasArray.Add("dynamic_alias"); // 新增元素 // 移除指定元素:先找到要删的项再移除 var itemToRemove = aliasArray.FirstOrDefault(item => item.ToString() == "sample"); if (itemToRemove != null) aliasArray.Remove(itemToRemove); // 替换整个数组的话: // config["alias"] = new JArray("dyn_1", "dyn_2"); // 3. 更新子属性 config["variables"]["temperature"]["max"] = 350; config["variables"]["temperature"]["unit"]["value"] = "°F"; config["variables"]["temperature"]["description"] = "动态更新后的温度描述"; // 4. 保存更新后的JSON string updatedJson = config.ToString(Formatting.Indented); File.WriteAllText(jsonPath, updatedJson);
小提示
- 用
Formatting.Indented序列化可以让保存后的JSON保持缩进格式,可读性更好 - 如果JSON字段名和C#属性名不一致,强类型方案里可以用
[JsonProperty]特性映射,比如[JsonProperty("make")] public string Brand { get; set; } - 操作数组时,
JArray提供了Insert、Clear等方法,按需使用就行
内容的提问来源于stack exchange,提问作者Nandakumar1712
相关产品推荐
相关产品推荐

