我想使用字符串路径向JSON对象添加新的Jproperty。我正在检索现有路径,然后添加一个新值。无论我如何选择一个令牌,或者无论我称之为哪个添加方法(最相关的是Addafterself)或我提供的新价值,我都会收到一个例外:
:运行时异常(第9行):newtonsoft.json.linq.jproperty不能具有多个值。
您可以在这里看到此失败:https://dotnetfiddle.net/mnvmoi
为什么我不能在这种情况下添加jproperty?
using System;
using Newtonsoft.Json.Linq;
public class Program
{
public static void Main()
{
JObject test = JObject.Parse("{"test":123,"deeper":{"another":"value"}}");
test.SelectToken("deeper.another").AddAfterSelf(new JProperty("new name","new value"));
}
}
抛出异常的原因是 SelectToken()
返回属性的JValue
不是 JProperty
本身。具体来说,它返回带有名称"another"
的JProperty
拥有的JValue
。如果您这样做:
Console.WriteLine("Result type: {0}; result parent type: {1}", result.GetType(), result.Parent.GetType());
导致
Result type: Newtonsoft.Json.Linq.JValue; result parent type: Newtonsoft.Json.Linq.JProperty
并且,如果您进一步打印了从JToken
层次结构到SelectToken()
返回的值的对象类型,您将看到JValue
代币中包含的JProperty
令牌:
Depth: 0, Type: JObject
Depth: 1, Type: JProperty: deeper
Depth: 2, Type: JObject
Depth: 3, Type: JProperty: another
Depth: 4, Type: JValue: value
JSON.NET文档还表明SelectToken()
返回所选属性的值:
string name = (string)o.SelectToken("Manufacturers[0].Name"); Console.WriteLine(name); // Acme Co
由于 JProperty
不能具有一个以上的值,因此当您尝试在层次结构中的值之后立即添加JProperty
时,您正在尝试将其添加为其父级JProperty
的孩子,从而引发异常。
而是将其添加到父母的父母:
test.SelectToken("deeper.another").Parent.AddAfterSelf(new JProperty("new name","new value"));
样品小提琴显示上述所有内容。