Search code examples
jsonjsonpath

Using JsonPath when you don't know if you're dealing with an object or array


Given the following 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
        }
    },
    "expensive": 10
}

We can use a path expression like $.store.book[*].author to get all the authors. But what if we don't know beforehand whether book is an array or an object, e.g. what if we could have the above JSON but also something like this:

{
    "store": {
        "book": {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
        },
        "bicycle": {
            "color": "red",
            "price": 19.95
         }
    },
    "expensive": 10
}

Is there a "generic path" that could be used to get all authors in either case?


Solution

  • Yes, you could use:

    $.store..author
    

    Testable here:

    https://jsonpath.curiousconcept.com/

    'Hope this helps.