C# 更改Json中属性的键

C# 更改Json中属性的键,c#,json,winforms,key,C#,Json,Winforms,Key,最近我尝试制作一个json编辑器(与treeview一起使用),我做了更改值函数,我也可以更改一些键,但我不能在对象中设置键。 我可以设置值: SetValue(ref JObject main,JToken token,JToken newValue) { //2nd argument is obj.SelectToken(node.Path) token.Replace(newValue); } 我还可以设置一些键: SetKey(ref JObject main,JTo

最近我尝试制作一个json编辑器(与treeview一起使用),我做了更改值函数,我也可以更改一些键,但我不能在对象中设置键。 我可以设置值:

SetValue(ref JObject main,JToken token,JToken newValue) {
    //2nd argument is obj.SelectToken(node.Path)
     token.Replace(newValue);
}
我还可以设置一些键:

SetKey(ref JObject main,JToken token,string newKey) {
    //2nd argument is obj.SelectToken(node.Path)
    //However, if token is in object, it seys the key of object because parent is object
     (token.Parent as JProperty).Replace(newKey);
}
但是我如何设置这些键呢?
注意。

您不需要通过ref传递原始根对象,也不需要原始根对象。你只关心JToken和它的父母

在这种情况下,您希望将“替换”视为:

  • 通过新键添加旧值
  • 删除旧的键/值对
我们可以假设,如果要为键值对替换键,则该对象是JProperty令牌。此外,如果要替换键,则可以安全地假定父对象是JObject。您可以这样称呼它:

var json = "{ 'key1': 'val1' }";
JObject parsedObj = JsonConvert.DeserializeObject<JObject>(json);
SetKey(parsedObj, parsedObj.First, "key2");
var json=“{'key1':'val1'}”;
JObject parsedObj=JsonConvert.DeserializeObject(json);
SetKey(parsedObj,parsedObj.First,“key2”);

我遇到了一个类似的问题,我不得不从JObject中的所有属性中删除空白,但不想使用helper函数。使用System.Linq时使用

var subjects=jObject.subjects()。其中(attr=>attr是JProperty&((JProperty)attr).Name.Contains(“”).ToList();
后代.ForEach(attr=>attr.Parent[((JProperty)attr.Name.Replace(“,string.Empty)]=((JProperty)attr.Value);
ForEach(attr=>attr.Remove());

这是一个很好的解决方案=)但是当我以前尝试打印父对象时,我得到的是jproperty而不是object。家长是如何工作的?@TalhaTalipAıkgöz如果你试图从代币上走到家长身边,你可能会遇到意想不到的问题,尽管从技术上讲这也应该有效。也就是说,如果您这样做,您很可能必须转换到
JObject
。然而,在我的方法中,如果我已经在一个JSON树上行走,我可能知道当前的根对象和我感兴趣的令牌。与尝试从令牌访问父对象相比,在此时简单地传递它们更容易。因为父对象是jproperty,所以currentObject.SelectToken(lastNode.GetNodePath())是我要查找的作业对象。因此,方法是:void SetKey(this JObject@object,string oldKey,string newKey){JToken oldValue=obj[oldKey];@object.Remove(oldKey);@object[newKey]=oldValue}
var json = "{ 'key1': 'val1' }";
JObject parsedObj = JsonConvert.DeserializeObject<JObject>(json);
SetKey(parsedObj, parsedObj.First, "key2");