如何在Newtonsoft JObject中更新所有层级带指定前缀的键的值
JObject批量更新指定前缀键值的实现方案
你可以通过递归遍历JObject所有层级的属性,匹配前缀后统一赋值,以下是可直接运行的实现:
首先需要引入Newtonsoft.Json的命名空间:
using Newtonsoft.Json.Linq;
核心实现方法
public static void UpdateValuesByKeyPrefix(JObject targetObj, string keyPrefix, JToken newValue) { // 转成List避免遍历过程中修改结构导致的枚举异常 foreach (var property in targetObj.Properties().ToList()) { // 递归遍历嵌套的JObject对象 if (property.Value.Type == JTokenType.Object) { UpdateValuesByKeyPrefix((JObject)property.Value, keyPrefix, newValue); } // 匹配前缀后更新值,默认区分大小写 if (property.Name.StartsWith(keyPrefix, StringComparison.Ordinal)) { property.Value = newValue; } } }
调用示例(对应你的测试场景)
// 你的示例JSON字符串 string jsonStr = @"{ ""nameOne"": ""dave"", ""age"": 23, ""foo"": { ""nameTwo"": ""pete"", ""age"": 56 } }"; // 解析为JObject JObject jObj = JObject.Parse(jsonStr); // 统一将所有前缀为name的键的值修改为chris UpdateValuesByKeyPrefix(jObj, "name", "chris"); // 输出修改后的结果 Console.WriteLine(jObj.ToString());
运行输出结果
{ "nameOne": "chris", "age": 23, "foo": { "nameTwo": "chris", "age": 56 } }
补充说明
- 如果需要忽略大小写匹配前缀,将
StartsWith方法的第二个参数改为StringComparison.OrdinalIgnoreCase即可 - 该方法支持任意层级的嵌套对象,也支持替换为数字、布尔、对象等任意类型的新值
内容的提问来源于stack exchange,提问作者user3352488
相关产品推荐
相关产品推荐

