7

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.

Darshan Mehta
  • 30,102
  • 11
  • 68
  • 102

4 Answers4

7

Your post doesn't say whether you are using Goessner or Flow Communications JSON Path expression evaluator. Both are available on the expression tester site you are using. If you are using Goessner the following query works, but not on the expression testing site you are using

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

Note the double equal sign (@.category=='reference') instead of a single one. Also, there should be no space after the comma where selecting the fields 'author','title'.

You can see the expression working here http://www.jsonquerytool.com/sample/jsonpathselectmultiplefields

Duncan
  • 781
  • 6
  • 7
  • 2
    In my case I would like to maintain the 'path' structure - is this possible: so the result would be of the form: {"store": {"book": [{"author": "Nigel Rees", "title": "Sayings of the Century"}]}}? – Kieran Ryan Dec 22 '16 at 19:17
3

Using Jayways JsonPath (Java) this works:

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

Test different implementations here

kalle
  • 1,869
  • 14
  • 14
1

What if you try this:

$.store.book[?(@.category='reference')]['author']['title']
SergStav
  • 750
  • 5
  • 19
0

With :

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

OUTPUT:

"Nigel Rees"
"Sayings of the Century"
Gilles Quénot
  • 173,512
  • 41
  • 224
  • 223
  • thanks for the reply. Can we do the same using JSONPath rather than jq? We are using JSONPath library in backend and don't really want to change it to jq as a lot of other apis are using that. – Darshan Mehta Jan 07 '15 at 13:44