Как добавить JObject внутри существующего JArray? - PullRequest
1 голос
/ 04 октября 2019

Мой Jobject выглядит следующим образом:

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

Как добавить еще один JObject в «правила» JArray в JSON? как показано ниже

    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);

Но, intellisense не позволяют мне это делать. Работа с библиотеками 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?)  

1 Ответ

1 голос
/ 04 октября 2019

Ваша проблема в том, что метод доступа JObject.Item Property (String), используемый в Parent["rules"].Add(sampleObj), возвращает 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, поэтому также требуется литье.

Связанный:

Демо-скрипка здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...