按路径设置JSON属性

Arq*_*cto 4 c# json json.net

有没有办法使用Json.NET通过路径设置属性?

JObject o = JObject.Parse(@"{
'CPU': 'Intel',
'Drivers': {
   'Mouse': 'HPQ',
   'VideoCard' : 'NVidia'
   }
}");

//something like that
o.SetByPath("Drivers.VideoCard") = "Intel";
Run Code Online (Sandbox Code Playgroud)

可能吗?

顺便说一句,我知道我可以这样做:

o["Drivers"]["VideoCard"] = "Intel";
Run Code Online (Sandbox Code Playgroud)

但那不是我想要的.

sen*_*hin 10

JObject.SelectTokenJToken.Replace方法可以在这里使用基本上达到同样的效果.

static void Main(string[] args)
{
    JObject obj = JObject.Parse(@"{
      'CPU': 'Intel',
      'Drivers': {
        'Mouse': 'HPQ',
        'VideoCard' : 'NVidia'
       }
    }");
    Console.WriteLine(obj);

    JToken token = obj.SelectToken("Drivers.VideoCard");
    token.Replace("Intel");
    Console.WriteLine(obj);
}
Run Code Online (Sandbox Code Playgroud)

输出:

{
  "CPU": "Intel",
  "Drivers": {
    "Mouse": "HPQ",
    "VideoCard": "NVidia"
  }
}
{
  "CPU": "Intel",
  "Drivers": {
    "Mouse": "HPQ",
    "VideoCard": "Intel"
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以使用扩展方法.

static void SetByPath(this JObject obj, string path, string value)
{
    JToken token = obj.SelectToken(path);
    token.Replace(value);
}
Run Code Online (Sandbox Code Playgroud)