Newtonsoft从JSON路径更新JObject?

时间:2016-03-08 17:44:12

标签: c# json.net

我知道使用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路径。谢谢。

2 个答案:

答案 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)中放置的一些示例