Выберите элементы из массива JSON, используя JsonPath, где элемент не содержит определенного свойства - PullRequest
0 голосов
/ 25 мая 2018

У меня есть файловая структура JSON, подобная этой:

{
    "property1": 1,
    "property2": 2,
    "someArray": [
        {
            "item1": 1,
            "item2": 2
        },
        {
            "item1": 5
        }
    ]
}

Все, что я хочу сделать, - это выбрать объекты из массива, который не содержит свойства item2.Я использую NewtonsoftJson и пытаюсь сделать это, используя путь JSON.

Мне удалось выбрать объекты, которые содержат свойство item2, но я не знаю синтаксис для инверсии логики.

// Selects all the tokens where item2 property exists.
var tokens = jsonToken.SelectTokens("$.someArray[?(@.item2)]");

Я попытался использовать ! в части фильтра следующим образом: $.someArray[?(!@.item2), но выдает ошибку, говорящую, что ! - неожиданный символ.

Что мне делатьинвертировать логику выбора здесь?

Рабочий пример здесь .

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Я не знаю ни одного способа использования JsonPath.

Вы можете использовать LINQ в дереве JToken, чтобы выполнить желаемую фильтрацию.Это то, что JSON.Net использует под капотом, когда вы выполняете запрос JSONPath.

Я бы написал запрос linq следующим образом:

(jsonToken["someArray"] as JArray)
.OfType<JObject>()
.Where(x => !x.ContainsKey("item2"));
0 голосов
/ 25 мая 2018

Придумали такой подход.Надеюсь, поможет. Рабочий пример

static string jonsString = (@"{
        'property1': 1,
        'property2': 2,
        'someArray': [
            {
                'item1': 1,
                'item2': 2
            },
            {
                'item1': 5,
                'item2': 2
            }
        ]
    }");

 var tokens = JObject.Parse(jonsString)["someArray"].ToObject<List<Dictionary<string, string>>>().Where(p=>!p.Keys.Contains("item2"));

        foreach (var token in tokens)
        {
           foreach(var item in token)
            {
                Console.WriteLine(item.Key +":"+ item.Value);
            }
        }
        Console.ReadLine();

Вывод:

item1:5
...