我看了另一个qs。但 ans 不适用于 newtonsoft 13.0.3.
我已在 github 上发布了我的 qs。
基本上是像这样的json
{
"store": {
"book": [
{
"category": "reference",
"authors": [
{
"firstName": "Nigel",
"lastName": "Rees"
},
{
"firstName": "Evelyn",
"lastName": "Waugh"
}
],
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"authors": [
{
"firstName": "Herman",
"lastName": "Melville"
},
{
"firstName": "Somebody",
"lastName": "Else"
}
],
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"authors": [
{
"firstName": "Evelyn",
"lastName": "Waugh"
},
{
"firstName": "Nigel",
"lastName": "Rees"
}
],
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"authors": [
{
"firstName": "J. R. R.",
"lastName": "Tolkien"
}
],
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}
我想获取 jsonpath 过滤器表达式,它允许我选择姓氏为 Waugh 的作者的书名。 我正在使用 Newtonsoft 13.0.3 和 C#。
中的
empty false
语法不支持。相反,使用?(<boolean expr>)
语法(如原始 JSONPath 提案中所示)来选择具有匹配属性的数组成员,如下所示:
var titles = jtokenRoot
.SelectTokens("store.book[?(@.authors[?(@.lastName == 'Waugh')])].title")
.ToList();
演示小提琴#1 这里。
备注:
authors[?(@.lastName == 'Waugh')]
选择
lastName
为
Waugh
的任何作者。
store.book[?(@.authors[?(@.lastName == 'Waugh')])]
选择任何作者的
lastName
为
Waugh
的任何书籍。
SelectTokens 与特定 c# 的此答案,了解嵌套查询的另一个示例。
原始 JSONPath 提案指出()
应该是一个脚本表达式,使用底层脚本引擎——但没有以任何方式指定“底层脚本引擎”的任何要求,这显然留下了对于应该支持和不应该支持哪些查询有一定的解释空间。因此,虽然大多数 JSONPath 查询引擎都支持提案中所示的简单示例,但除此之外,它们似乎都支持不同的内容。 Newtonsoft 有自己的查询引擎,其代码可以在
这里找到。
。例如,以下查询会去除前导和尾随空格并忽略大小写:
SelectTokens("store.book[?(@.authors[?(@.lastName =~ /^[\\s]*[Ww][Aa][Uu][Gg][Hh][\\s]*$/)])].title")
演示小提琴 #2 这里。