使用JsonPath过滤JSON节点的问题

时间:2017-09-15 09:15:49

标签: java json jsonpath

我有JSON这样的结构:

{
    "stores": {
        "store1_id": {
            "books": {
                "book1_ISBN": {
                    "category": "reference",
                    "author": "Nigel Rees",
                    "title": "Sayings of the Century",
                    "price": "8.95"
                },
                "book2_ISBN": {
                    "category": "fiction",
                    "author": "Evelyn Waugh",
                    "title": "Sword of Honour",
                    "price": "12.99"
                }
            }
        },
        "store2_id": {
            "books": {
                "book3_ISBN": {
                    "category": "fiction",
                    "author": "J. R. R. Tolkien",
                    "title": "The Lord of the Rings",
                    "isbn": "0-395-19395-8",
                    "price": "22.99"
                }
            }
        }
    }
}

我用Jayway JsonPath解析它。我尝试使用这样的表达式获得所有具有小说类别的书籍:

$[?(@.stores.*.books)].stores.*.books[?(@.*.category=="reference")]

但是我得到了空洞的结果,虽然根据操作员的相同记录,我希望我会收到#34;世纪的谚语"书籍节点:

"book1_ISBN": {
    "category": "reference",
    "author": "Nigel Rees",
    "title": "Sayings of the Century",
    "price": "8.95"
}

有趣的是,当我使用没有等于运算符的表达式时,

$[?(@.stores.*.books)].stores.*.books[?(@.*.category)]

我得到了所有三本书。为什么我的表达方式与同等的运算符不起作用?

1 个答案:

答案 0 :(得分:1)

我在这里试过你的表情: http://jsonpath.com/? 并且他们都不能使用过滤器和没有过滤器工作。 我不明白你为什么要先过滤这些元素:(@ .stores。*。books)
无论如何,如果你只想过滤所有类别"小说"的书籍,这就更简单了:

$..[?(@.category=="fiction")]

我希望这有帮助。