【问题标题】:How to add a JObject inside an existing JArray?如何在现有的 JArray 中添加 JObject?
【发布时间】:2019-10-04 15:30:40
【问题描述】:

我的Jobject如下:

JObject sampleObj = "{
      "operator": "AND",
      "rules": [
        {
          "field": "Entity.Country",
          "condition": "=",
          "value": "'USA'"
        },
        {
          "field": "Entity.ShortName",
          "condition": "=",
          "value": "'Adele'"
        }
      ]
    }"

如何在 JSON 的 JArray“规则”中添加另一个 JObject?如下所示

    JObject Parent  =
          "{
    "operator": "AND",
    "rules": [{
            "field": "Entity.Country",
            "condition": "=",
            "value": "'USA'"
        },
        {
            "field": "Entity.ShortName",
            "condition": "=",
            "value": "'Adele'"
        },
        {
            "operator": "AND",
            "rules": [{
                    "field": "Entity.Country",
                    "condition": "=",
                    "value": "'USA'"
                },
                {
                    "field": "Entity.ShortName",
                    "condition": "=",
                    "value": "'Adele'"
                }
            ]
        }
    ]
}" 

我试过了:

Parent["rules"].Add(sampleObj);
Parent.selectToken("rules").Add(sampleObj);

但是,智能感知不允许我这样做。工作 C# + Newtonsoft.Json 库:

'JToken' does not contain a definition for 'Add' and no accessible extension method 'Add' accepting a first argument of type 'JToken' could be found (are you missing a using directive or an assembly reference?)  

【问题讨论】:

  • 听起来你需要投射。 ((JArray)Parent["rules"]).Add(sampleObj)

标签: c# json json.net


【解决方案1】:

您的问题是Parent["rules"].Add(sampleObj) 中使用的访问器方法JObject.Item Property (String) 返回一个JToken,它是所有可能的JSON 值(原始或非原始)的抽象基类。因此它没有Add() 方法,因为表示原始值的派生类JValue 没有Add() 方法。

因此,您需要将Parent["rules"] 转换为它的实际类型,即JArray,以便添加一个数组项:

((JArray)Parent["rules"]).Add(sampleObj);

如果您认为它看起来更简洁,您可以使用 JToken.Value<T>(Object key) 代替内联转换,它的作用相同:

Parent.Value<JArray>("rules").Add(sampleObj);

或者,如果"rules" 数组可能尚未创建:

var array = Parent.Value<JArray>("rules") ?? (JArray)(Parent["rules"] = new JArray());
array.Add(sampleObj);

同样,JToken.SelectToken Method (String) 返回 JToken,因此也需要强制转换。

相关:

演示小提琴here.

【讨论】:

  • 非常感谢朋友分享这些有用的链接。那肯定有帮助。 @dbc
猜你喜欢
  • 2017-01-22
  • 2021-12-18
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
相关资源
最近更新 更多