为什么 AddAfterSelf 在与 SelectToken 一起使用时会返回'JProperty cannot have multiple values'?



我想使用字符串路径向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"));

样品小提琴显示上述所有内容。

相关内容

  • 没有找到相关文章

最新更新