使用JsonPath从JSON数组中选择项目,其中item不包含特定属性

时间:2018-05-25 11:20:26

标签: c# json.net jsonpath

我有一个类似于此的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),但它会引发错误,指出!是意外字符。

我该怎么做才能在这里反转选择逻辑?

工作示例here

2 个答案:

答案 0 :(得分:0)

想出了这种方法。希望能帮助到你。 Working Example

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

答案 1 :(得分:0)

我不知道使用JsonPath的任何方式。

您可以在JToken树上使用LINQ进行所需的过滤。 这是JSON.Net在执行JSONPath查询时使用的内容。

我会像这样编写linq查询:

(jsonToken["someArray"] as JArray)
.OfType<JObject>()
.Where(x => !x.ContainsKey("item2"));