C# Newtonsoft从JSON路径更新作业对象?
我知道使用select tokens函数传递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路径。谢谢
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");