Find the path of a key / value in a JSON hierarchy easily.
When working with big and nested JSON files, sometimes it's very difficult to figure out the path of a key. You open the JSON file in a text editor, find the key / value pair you need, but then it can be a pain to get the full path of the key.
Consider the following JSON file:
{
"a": 1,
"b": {
"c": 2,
"friends": [
{
"best": "Alice"
},
{
"second": "Bob"
},
[5, 6, 7],
[
{"one": 1},
{"two": 2}
]
]
}
}
JSON Path will traverse it recursively and print every path / value pair:
$ ./jsonpath.py samples/short.json
root['a'] => 1
root['b']['c'] => 2
root['b']['friends'][0]['best'] => 'Alice'
root['b']['friends'][1]['second'] => 'Bob'
root['b']['friends'][2][0] => 5
root['b']['friends'][2][1] => 6
root['b']['friends'][2][2] => 7
root['b']['friends'][3][0]['one'] => 1
root['b']['friends'][3][1]['two'] => 2
The idea is to combine its usage with the Unix command
grep
. For instance, what's the path of the key that
leads to Bob?
$ ./jsonpath.py samples/short.json | grep -i bob
root['b']['friends'][1]['second'] => 'Bob'
Then simply paste it in your application:
>>> d
{'a': 1, 'b': {'c': 2, 'friends': [{'best': 'Alice'}, {'second': 'Bob'}, [5, 6, 7], [{'one': 1}, {'two': 2}]]}}
>>> d['b']['friends'][1]['second']
'Bob'
>>>
The program was tested under Linux. It only uses the standard library, so you only need to create a virtual environment if you need a development version. With the development version you can do type checking and you can create a standalone executable.
$ poetry install
If you want a standalone executable, then issue the command
$ pynt exe
which will create the executable file jsonpath
in the
dist/
folder. (Note: for this to work, install the dev. version.)
See Chris Nielsen's excellent JSON Visualization webapp. Somewhat hidden feature, but if you click on an item in the table, you'll get its path on the left side. I wanted something similar in the command line. Once I was working with sensitive data, and I didn't want to paste them in a third-party webapp.