如何使用json路径在json字符串中添加新属性
问题描述:
我想为现有的json字符串添加json属性(名称和值)或json数据(数组)。如何使用json路径在json字符串中添加新属性
用户必须指定一个json路径来指定添加它的位置。
有人可以帮助我提供一个链接/示例来取得进展。
问候, 阿马尔
答
编辑:经过google'ing有点我注意到.SelectToken()
!当提到XPath时,这是我想到的。
// Inpup JSON
string input = "{ body: { name: { firstname: 'John', lastname: 'Doe' }, age: 43 } }";
JToken json = JToken.Parse(input); // Parsed to JToken as type may not be known.
// Select token based on JSONPath, see: http://goessner.net/articles/JsonPath/
JToken nameToken = json.SelectToken("$['body']['name']");
nameToken["middlename"] = "something";
// Prints: {"body":{"name":{"firstname":"John","lastname":"Doe","middlename":"something"},"age":43}}
string output = json.ToString(Newtonsoft.Json.Formatting.None);
OLD:
好像你想要的东西,例如Xpath的JSON。所以你可以找到一个现有的对象/数组并添加到?
我的建议是为Json搜索现有的路径工具。 这里是你可以怎么做一个快速和肮脏的例子:
static void Main(string[] args)
{
string input = "{ body: { name: { firstname: 'John', lastname: 'Doe' }, age: 43 } }";
JToken json = JToken.Parse(input);
UpdateJson(json, "body/name/middlename", "Something");
// {"body":{"name":{"firstname":"John","lastname":"Doe","middlename":"Something"},"age":43}}
string output = json.ToString(Newtonsoft.Json.Formatting.None);
UpdateJson(json, "body/jobs", new JArray(){ "C# Dev", "Network Master" });
// {"body":{"name":{"firstname":"John","lastname":"Doe","middlename":"Something"},"age":43,"jobs":["C# Dev","Network Master"]}}
string output2 = json.ToString(Newtonsoft.Json.Formatting.None);
}
private static void UpdateJson(JToken source, string path, JToken value)
{
UpdateJsonInternal(source, path.Split('/'), 0, value);
}
private static void UpdateJsonInternal(JToken source, string[] path, int pathIndex, JToken value)
{
if (pathIndex == path.Length - 1)
{
if (source is JArray)
{
((JArray)source)[int.Parse(path[pathIndex])] = value;
}
else if (source is JObject)
{
((JObject)source)[path[pathIndex]] = value;
}
}
else if (source is JArray)
{
UpdateJsonInternal(((JArray)source)[int.Parse(path[pathIndex])], path, pathIndex + 1, value);
}
else if (source is JObject)
{
UpdateJsonInternal(((JObject)source)[path[pathIndex]], path, pathIndex + 1, value);
}
}
}
这增加或更新与指定路径的JToken价值的源泉。 所以'body/name/middlename'或者将'middlename'添加到'name'或者用'value'更新它。如果'name'不存在,这个例子简单地失败。
答
你可以用Newtonsoft.Json:
var input = "{ test: true }";
var jObject = JObject.Parse(input);
jObject["updated"] = true;
jObject["array"] = new JArray("item1", "item2", "item3");
var s = jObject.ToString();
// { test: true, updated: true, array: ["item1", "item2", "item3"] }
Console.WriteLine(s);
上面我们已经分析到一个JObject
JSON字符串,然后与JObject我们可以开始添加字段进行修改等等。然后找回我们在JObject上调用ToString
的字符串表示。
+0
谢谢凯文。有没有什么办法设置JSON值没有属性名称,只需追加到现有的JSON –
感谢彼得快速响应。 –
感谢Peter和Kevin的快速回复。如何从路径主体/名称中获取JObject,以便我可以设置jObject [“middlename”] =“something”;而不是迭代。根据我的要求,用户必须输入路径,属性。这里的属性可以是名称和值对或JSON数据本身。所以我需要jObject [property] = value; –
好的,我搜索了一下,发现'.SelectToken()'。这个功能允许你选择一个基于路径的json令牌。你可以阅读更多的路径:http://goessner.net/articles/JsonPath/ 我已经编辑了我的答案一个简单的例子 –