我想使用字符串路径将新的JProperty添加到JSON对象。 我正在检索现有路径,然后在其附近添加一个新值。 似乎无论我如何选择一个令牌,或者无论我调用哪种Add方法(最相关的是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"));
}
}
答案 0 :(得分:3)
抛出异常的原因是SelectToken()
返回属性的JValue
而不是 JProperty
本身。具体而言,它会返回名称为JValue
的{{1}}所拥有的JProperty
。如果你这样做,你可以看到:
"another"
结果是
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 documentation也表示SelectToken()
返回所选媒体资源的值:
string name = (string)o.SelectToken("Manufacturers[0].Name"); Console.WriteLine(name); // Acme Co
由于JProperty
不能包含多个值,因此当您尝试在层次结构中的值之后立即添加JProperty
时,您尝试将其添加为其父级JProperty
的子级1}},抛出异常。
相反,将其添加到父级的父级:
test.SelectToken("deeper.another").Parent.AddAfterSelf(new JProperty("new name","new value"));
示例fiddle显示以上所有内容。