Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Newtonsoft从JSON路径更新作业对象?_C#_Json.net_Jsonpath - Fatal编程技术网

C# Newtonsoft从JSON路径更新作业对象?

C# Newtonsoft从JSON路径更新作业对象?,c#,json.net,jsonpath,C#,Json.net,Jsonpath,我知道使用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路径。谢谢

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

Json路径(以及XPath)用于从层次结构中获取项,而不是设置它们。您需要使用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;
    }
}
希望这对你有用


你可以找到我放在

中的一些相关例子:见Good deal。我想我可以标记json路径并拉出属性名,因为它应该始终是路径中的最后一项。在newtonsoft.json系统中,有“replace”函数可以直接设置值。是否有方法修改该路径上的json,从而在路径中创建任何缺失的标记?因此,当您试图设置“root.item[0].myProperty”但只有“root”对象存在时,它不仅会设置“myProperty”,还会首先创建一个包含该属性的对象和一个包含该对象的数组,以及一个包含该数组的“item”属性。@KyleDelaney我认为这在一般情况下是不可能的。如果您需要该功能,您肯定可以用扩展方法或其他方式对其进行编码。这将涉及解析jsonpath字符串,解释路径的每个部分对对象层次结构的含义,以及在运行时导航/创建对象。这应该不会太难,因为有非常简单的规则。@Thaina有最好的答案
var = JObject.Parse("{some json string}");   
var jsonObj = JsonExtensions.ReplacePath(jsonObj,
                                         "$. root.item[0].myProperty",
                                         "My New Value");