我有一个类似于此的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。
答案 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"));