json路径表达式在没有数组的情况下无法工作



我试图实现一个看似简单的JSON路径过滤器,但未能使其正常工作。想知道其他人是否对Json有更多的经验。NET对JSON路径的实现对下一步有一些想法。

这个场景失败了,但我认为应该奏效吗?

var jsonText = @"{
'event': {
'data': {
'intField': 1,
'stringField': 'hello'
}
}
}";
JObject json = JsonConvert.DeserializeObject<JObject>(jsonText);
string jsonPath = "$.event.data[?(@.intField == 1)]";
IList<JToken> output = json.SelectTokens(jsonPath).ToList();
// this check fails
Assert.IsTrue(output.ToList().Count > 0);

如果我通过在"data"对象周围添加一个伪数组来处理JSON负载,那么我就可以让查询正常工作。但是,我宁愿不处理JSON负载。

var jsonText = @"{
'event': {
'data': [{
'intField': 1,
'stringField': 'hello'
}]
}
}";
JObject json = JsonConvert.DeserializeObject<JObject>(jsonText);
string jsonPath = "$.event.data[?(@.intField == 1)]";
IList<JToken> output = json.SelectTokens(jsonPath).ToList();
// now this works
Assert.IsTrue(output.ToList().Count > 0);

问题是Json。NET的JsonPATH过滤表达式运算符[?()]的实现仅适用于过滤集合(数组(中的对象,而不适用于其他对象中的对象。此限制在Issue#1256中报告:对象的JSONPath脚本未正确执行,Newtonsoft对此进行了回复,

我对此不确定。JSONPath中没有任何内容规定过滤器应应用于对象。
JamesNK对2017年3月24日发表评论

此限制不时出现,例如What';s使用Newtonsoft搜索JSON根对象的正确JsonPath表达式。Json。NET?或如何在JsonPath中筛选非数组。如果你觉得过滤对象内部的对象很有用,你可能想在GitHub上为这个问题添加一条评论。

一个解决方法有时可以完成这项工作,即在包含对象属性名称和筛选表达式运算符之间添加递归下降运算符..,如下所示:

string jsonPath = "$.event.data..[?(@.intField == 1)]";

而且,在您的特定情况下,修改后的查询现在可以工作并选择一个对象。在这里演示小提琴。

当然,这个修改后的查询也将匹配以下内容:

{
"event": {
"data": {
"extra_added_level_of_nesting": {
"intField": 1,
"stringField": "hello"
}
}
}
}

(此处为fiddle#2(,因此变通方法可能不足以满足您的需求。

解决方法之所以成功,显然是因为Json。NET将递归下降运算符返回的结果视为一个集合,因此可以对其应用过滤表达式运算符

相关内容

最新更新