如何使用Json.NET修改JSON属性值,通过JObject.SelectTokens()编辑目标元素
实现方法
你可以通过JSONPath筛选表达式配合SelectTokens方法直接定位到目标节点,再修改属性值即可,具体实现如下:
1. 筛选规则说明
使用的JSONPath规则如下,可一次性匹配到两个需要修改的columns数组元素:$.summary.summaryDataTable.columns[?(@.title == 'AREA1' || @.title == 'AREA2')]
$代表JSON根节点.summary.summaryDataTable.columns是逐层定位到存储列配置的数组[?()]内是过滤条件,筛选数组中title属性为目标值的元素
2. 完整代码示例
using Newtonsoft.Json; using Newtonsoft.Json.Linq; // 原始JSON字符串 string rawJson = @"{ ""summary"":{ ""summaryDataTable"":{ ""id"":""summaryDataTable"", ""type"":""dataTable"", ""source"":""/SmartScreen/SummaryFw"", ""columns"":[ { ""name"":""CreateDate"", ""title"":""AREA1"", ""filterable"":false }, { ""name"":""CreateUser"", ""title"":""AREA2"", ""filterable"":false } ], ""options"":{ ""showFilter"":false } } } }"; // 解析为JObject对象 JObject jObject = JObject.Parse(rawJson); // 批量筛选目标节点 var targetColumns = jObject.SelectTokens("$.summary.summaryDataTable.columns[?(@.title in ['AREA1','AREA2'])]"); foreach (JObject column in targetColumns) { string currentTitle = column["title"].Value<string>(); // 替换为你需要的实际值即可 if (currentTitle == "AREA1") { column["title"] = "区域1"; } else if (currentTitle == "AREA2") { column["title"] = "区域2"; } } // 仅修改单个节点的简化写法 // var area1Node = jObject.SelectToken("$.summary.summaryDataTable.columns[?(@.title == 'AREA1')]"); // if (area1Node != null) // { // area1Node["title"] = "区域1"; // } // 输出验证修改结果 Console.WriteLine(jObject.ToString(Formatting.Indented));
注意事项
- 如果你使用的Newtonsoft.Json版本较低不支持
in语法,把筛选条件替换为[?(@.title == 'AREA1' || @.title == 'AREA2')]即可,效果完全一致。 - 调用
SelectToken时建议增加空判断,避免JSON结构变动找不到节点时报空引用异常。
内容的提问来源于stack exchange,提问作者Orhano95
相关产品推荐
相关产品推荐

