Exclude fields from JSON using JSONPath

Refresh

December 2018

Views

2.6k time

3

I am getting a JSON response from REST service call and want to select only some of the fields from response. I am using JSONPath to filter out the fields. Below is the JSON example:

{
    "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. I want to select author and title from the response where category is 'reference'. I am using the below JSONPath

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

This gives me below response:

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

However, I don't want all the fields. I only want author and title. If I try $.store.book[?(@.category='reference')]['author'], it gives me author name but if I try $.store.book[?(@.category='reference')]['author', 'title'], it doesn't return anything.

Is there any provision in JSONPath to select (or exclude) fields with or without condition?

I am using http://jsonpath.curiousconcept.com/ to test JSONPath.

Thanks in advance.

4 answers

3

Ваше сообщение не говорит, используете ли вы Goessner или Flow Communications JSON выражение Path оценщик. Оба доступны на тестере сайте выражения вы используете. Если вы используете Goessner следующий запрос работает, но не на сайте выражения тестирования вы используете

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

Обратите внимание на двойной знак равенства ( @.category=='reference') вместо одного. Кроме того , не должно быть пробела после запятой , где выбора полей 'author','title'.

Вы можете видеть выражение здесь работает http://www.jsonquerytool.com/sample/jsonpathselectmultiplefields

1

Что делать, если вы попытаетесь это сделать:

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

Использование Jayways JsonPath (Java) это работает:

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

Тестирование различных реализаций здесь

0

С :

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

ВЫХОД:

"Nigel Rees"
"Sayings of the Century"