Newtonsoft 在 jsonpath 表达式中支持嵌套过滤器吗?

问题描述 投票:0回答:1

我看了另一个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#。

c# json.net jsonpath
1个回答
0
投票

SelectTokens()

 支持嵌套查询,但链接答案
 中的 
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 有自己的查询引擎,其代码可以在

    这里找到。

  • 对于更复杂的字符串匹配,可以使用Newtonsoft的

    正则表达式运算符=~

    。例如,以下查询会去除前导和尾随空格并忽略大小写:

    SelectTokens("store.book[?(@.authors[?(@.lastName =~ /^[\\s]*[Ww][Aa][Uu][Gg][Hh][\\s]*$/)])].title")
    演示小提琴 #2 

    这里

© www.soinside.com 2019 - 2024. All rights reserved.