Newtonsoft 从 JSON 路径更新 JObject?

Newtonsoft update JObject from JSON path?

我知道使用 select 标记函数来传递 json 路径。例如:

JObject jObect = JObject.Parse("{some json string}");
JToken jToken = jObject.SelectToken("root.item[0].myProperty"); 

我正在寻找的是一种在给定 JSON 路径更新原始 JObject 的简单方法?

jObject[jsonPath] = "My New Value" 

显然,它采用对象键而不是 JSON 路径。谢谢。

Json 路径(以及与此相关的 xpath)用于 get 层次结构中的项目,而不是 set他们。您需要使用 JSON 路径 获取 父对象,然后通过正常方式 设置 属性。

var parent = jObject.SelectToken("root.item[0]");
parent["myProperty"] = "My New Value";

我认为@dbc 给出了一个很好的扩展,允许我们更新 json 对象值。可以找到他的答案.

但是,我会把我在上述答案的帮助下做出的解决方案放在这里:

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 jsonObj = JObject.Parse("{some json string}");   
jsonObj = JsonExtensions.ReplacePath(jsonObj,
                                         "$. root.item[0].myProperty",
                                         "My New Value");

希望这对你有用!

你可以找到我在fiddle (https://dotnetfiddle.net/ZrS2iV)

中放的一些例子

可以替换Jtoken函数来更新值

var parseResponse = JToken.Parse(jsonString);
//This commented code will update all the myproperty value in the item array
//var selectedPath = parseResponse.SelectToken("$.root.item[*].myProperty");
var selectedPath = parseResponse.SelectToken("$.root.item[0].myProperty");
if(selectedPath!=null){
selectedPath.Replace(newValue);
}