我知道使用select tokens函数传递json路径。例如:
JObject jObect = JObject.Parse("{some json string}");
JToken jToken = jObject.SelectToken("root.item[0].myProperty");
我正在寻找的是在给定的JSON路径下更新原始JObject的简单方法吗?
jObject[jsonPath] = "My New Value"
显然,它采用对象键而不是JSON路径。谢谢。
答案 0 :(得分:2)
Json路径(以及相关的xpath)用于从层次结构获取项目,而不是设置它们。您需要使用JSON路径获取父对象,然后通过正常方式设置属性。
var parent = jObject.SelectToken("root.item[0]");
parent["myProperty"] = "My New Value";
答案 1 :(得分:0)
我认为@dbc提供了很好的扩展,以允许我们更新json对象的值。可以找到他的答案here。
但是,我会在上面的答案的帮助下提出一个解决方案:
public static class JsonExtensions
{
public static JObject ReplacePath<T>(this JToken root, string path, T newValue)
{
if (root == null || path == null)
{
throw new ArgumentNullException();
}
foreach (var value in root.SelectTokens(path).ToList())
{
if (value == root)
{
root = JToken.FromObject(newValue);
}
else
{
value.Replace(JToken.FromObject(newValue));
}
}
return (JObject)root;
}
}
您可以执行的操作,使用上述方法,可以传递JObject,jsonPath和要替换的值。因此,在您的情况下,调用方法将如下所示:
var = JObject.Parse("{some json string}");
var jsonObj = JsonExtensions.ReplacePath(jsonObj,
"$. root.item[0].myProperty",
"My New Value");
希望这对您有用!
您可以找到我在fiddle (https://dotnetfiddle.net/ZrS2iV)中放置的一些示例