使用JSONPath从JSON中排除字段

时间:2015-01-07 13:10:38

标签: json jsonpath

我从REST服务调用中获取JSON响应,并且只想从响应中选择一些字段。我正在使用JSONPath过滤掉字段。以下是JSON示例:

{
    "store": {
        "book": [{
            "category": "reference",
            "author": "Nigel Rees",
            "title": "Sayings of the Century",
            "price": 8.95
        },
        {
            "category": "fiction",
            "author": "Evelyn Waugh",
            "title": "Sword of Honour",
            "price": 12.99
        },
        {
            "category": "fiction",
            "author": "Herman Melville",
            "title": "Moby Dick",
            "isbn": "0-553-21311-3",
            "price": 8.99
        },
        {
            "category": "fiction",
            "author": "J. R. R. Tolkien",
            "title": "The Lord of the Rings",
            "isbn": "0-395-19395-8",
            "price": 22.99
        }],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    }
}

E.g。我想从响应中选择作者和标题,其中类别是'参考'。我使用下面的JSONPath

$.store.book[?(@.category='reference')]

这让我得到以下回应:

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

但是,我不想要所有的领域。我只想要作者和头衔。如果我尝试$.store.book[?(@.category='reference')]['author'],它会给我作者姓名,但如果我尝试$.store.book[?(@.category='reference')]['author', 'title'],它就不会返回任何内容。

JSONPath中是否有任何条款可以选择(或排除)有或没有条件的字段?

我正在使用http://jsonpath.curiousconcept.com/来测试JSONPath。

提前致谢。

4 个答案:

答案 0 :(得分:3)

您的帖子没有说明您使用的是Goessner还是Flow Communications JSON Path表达式评估程序。两者都可以在您使用的表达式测试站点上找到。如果您使用Goessner,则以下查询有效,但不适用于您正在使用的表达式测试站点

$.store.book[?(@.category=='reference')]['author','title']

请注意双等号(@.category=='reference')而不是单个等号。此外,逗号后面应该没有空格选择字段'author','title'

你可以看到这里的表达方式 http://www.jsonquerytool.com/sample/jsonpathselectmultiplefields

答案 1 :(得分:2)

使用Jayways JsonPath(Java),这有效:

$.store.book[?(@.category == 'reference')]['author', 'title']

测试不同的实现here

答案 2 :(得分:1)

如果您尝试这样做怎么办:

$.store.book[?(@.category='reference')]['author']['title']

答案 3 :(得分:0)

使用

 $ jq '.store.book[] | select(.category=="reference") | .author, .title' json

输出:

"Nigel Rees"
"Sayings of the Century"