使用 Newtonsoft JObject 中的特定前缀更新所有键

Posted

技术标签:

【中文标题】使用 Newtonsoft JObject 中的特定前缀更新所有键【英文标题】:Update all keys with a specific prefix in Newtonsoft JObject 【发布时间】:2022-01-07 08:19:31 【问题描述】:

如何在具有特定值的 JObject 中的所有级别上更新具有给定前缀的所有键?例如


  "nameOne": "dave",
  "age": 23,
  "foo": 
    "nameTwo": "pete",
    "age": 56
  

如何将 nameOne 和 nameTwo (name*) 更新为“chris”?

【问题讨论】:

你能显示你的类链接到 json 吗? @Frenchy 没有其他课程。它只是一个使用 Parse() 方法创建的 JObject: _settings = JObject.Parse(File.ReadAllText(SettingsFile)); 你的对象有多少层,请告诉我们你到目前为止做了什么,错误或问题在哪里? @Serge 它并不比我的例子更深入。我还没有解决方案。 【参考方案1】:

如果它没有比你的例子更深,你可以试试这个

 _settings = JObject.Parse(File.ReadAllText(SettingsFile));

_settings["nameOne"]="cris";
_settings["foo"]["nameTwo"]="cris";

或者如果你需要一些搜索,试试这个

    var searchString = "name";
    var newValue = "cris";

    foreach (var property in _settings)
    
        var key = property.Key;

        if (property.GetType().Name != "JObject")
        
            if (key.Contains(searchString)) _settings[key] = newValue;
        
        else
        
            JObject prop = _settings[key] as JObject;
            foreach (var nestedProperty in prop)
            
                var nestedKey = nestedProperty.Key;
                if (nestedKey.Contains(searchString)) prop[nestedKey] = newValue;
            
        
    

您也可以使用 StartWith 或 EndsWith 来代替 Contains

在visual studio中测试过


  "nameOne": "cris",
  "age": 23,
  "foo": 
    "nameTwo": "cris",
    "age": 56
  

【讨论】:

我正在尝试更新与特定模式匹配的所有键,例如所有以“name”开头的键。

以上是关于使用 Newtonsoft JObject 中的特定前缀更新所有键的主要内容,如果未能解决你的问题,请参考以下文章

newtonsoft动态修改JObject

如何使Newtonsoft.Json.Linq.JObject不可变?

Newtonsoft.Json.Linq.JObject.ToObject() 以字符串格式转换日期

无法将类型'Newtonsoft.Json.Linq.JObject'的对象转换为类型

无法将“Newtonsoft.Json.Linq.JObject”类型的对象强制转换为“Newtonsoft.Json.Linq.JArray”

C# Newtonsoft.Json JObject移除属性,在序列化时忽略