Skip to main content

JSONPath implementation for Python

Project description

jsonpath2

Build Status

This repository contains an implementation of JSONPath (XPath for JSON) for the Python programming language.

API

Path class

The jsonpath2.path.Path class represents a JSONPath.

>>> s = '{"hello":"Hello, world!"}'
'{"hello":"Hello, world!"}'
>>> import json
>>> d = json.loads(s)
{'hello':'Hello, world!'}
>>> from jsonpath2.path import Path
>>> p = Path.parse_str('$["hello"]')
<jsonpath2.path.Path object>
>>> list(map(lambda match_data: match_data.current_value, p.match(d)))
['Hello, world!']
>>> list(map(lambda match_data: match_data.node.tojsonpath(), p.match(d)))
['$["hello"]']

This class is constructed with respect to the given instance of the jsonpath2.nodes.root.RootNode class (viz., the root_node property).

parse_str(strdata) class method

Parse the given string and return a new instance of this class.

parse_file(fileName, encoding='ascii') class method

Parse the contents of the given file and return a new instance of this class.

match(root_value) instance method

Match the given JSON data structure against this instance. For each match, yield an instance of the jsonpath2.node.MatchData class.

__eq__(other) instance method

Tests if two instances are equal.

__str__() instance method

Returns the string representation of this instance.

root_node property

The root node of the abstract syntax tree for this instance.

Node abstract class

The jsonpath2.node.Node class represents the abstract syntax tree for a JSONPath.

__eq__(other) instance method

Tests if two instances are equal.

__jsonpath__() instance method

Yields the lexer tokens for the string representation of this instance.

match(root_value, current_value) instance method

Match the given root and current JSON data structures against this instance. For each match, yield an instance of the jsonpath2.node.MatchData class.

tojsonpath() instance method

Returns the string representation of this instance.

MatchData class

The jsonpath2.node.MatchData class represents the JSON value and context for a JSONPath match.

This class is constructed with respect to a root JSON value, a current JSON value, and an abstract syntax tree node.

__eq__(other) instance method

Tests if two instances are equal.

root_value property

The root JSON value.

current_value property

The current JSON value (i.e., the matching JSON value).

node property

The abstract syntax tree node.

Syntax

XPath JSONPath Description
/ $ the root JSON value
. @ the current JSON value
/ . or [] child operator
// .. recursive descent (depth-first search)
* * wildcard (all elements of a JSON array; all values of a JSON object; otherwise none)
[] [] subscript operator
| [,] union operator (for two or more subscript operators)
n/a [start:end:step] slice operator (subset of elements of a JSON array)
[] ?() filter expression (for use with subscript operator)
JSONPath Filter Expression Description
$ or @ nested JSONPath (returns true if any match exists; otherwise, returns false)
=, !=, >, >=, <, <= binary operator, where left- and right-hand operands are nested JSONPaths or JSON values (returns true if any match exists; otherwise, returns false)
and, or, not Boolean operator, where operands are JSONPath filter expressions
( ... ) parentheses

Functions

See #14 for more information.

The syntax for a function call is the name of the function followed by the arguments in parentheses, i.e., name(arg1, arg2, ..., argN), where the arguments are either JSONPaths or JSON values.

>>> s = '{"hello":"Hello, world!"}'
'{"hello":"Hello, world!"}'
>>> import json
>>> d = json.loads(s)
{'hello':'Hello, world!'}
>>> from jsonpath2.path import Path
>>> p = Path.parse_str('$["hello"][length()]')
<jsonpath2.path.Path object>
>>> list(map(lambda match_data: match_data.current_value, p.match(d)))
[13]
>>> list(map(lambda match_data: match_data.node.tojsonpath(), p.match(d)))
['$["hello"][length()]']
JavaScript Function Signature
Array.length length(): int
Array.prototype.entries() entries(): List[Tuple[int, Any]]
Array.prototype.keys() keys(): List[int]
Array.prototype.values() values(): List[Any]
Object.entries() entries(): List[Tuple[str, Any]]
Object.keys() keys(): List[str]
Object.values() values(): List[Any]
string.length length(): int
String.prototype.charAt() charAt(index: int): str
String.prototype.substring() substring(indexStart: int, indexEnd: Optional[int]): str

In the above table, the type aliases (Any, List, Optional and Tuple) are defined by the typing module from the Python Standard Library.

Grammar and parser

The ANTLR v4 grammar for JSONPath is available at jsonpath2/parser/JSONPath.g4.

Installing ANTLR v4

Adapted from https://github.com/antlr/antlr4/blob/master/doc/getting-started.md.

cd /usr/local/lib
curl -O http://www.antlr.org/download/antlr-4.7.1-complete.jar

export CLASSPATH=".:/usr/local/lib/antlr-4.7.1-complete.jar:$CLASSPATH"

alias antlr4='java -Xmx500M -cp "/usr/local/lib/antlr-4.7.1-complete.jar:$CLASSPATH" org.antlr.v4.Tool'
alias grun='java org.antlr.v4.gui.TestRig'

Building the parser for the grammar

Adapted from https://github.com/antlr/antlr4/blob/master/doc/python-target.md.

antlr4 -Dlanguage=Python3 -o . -lib . jsonpath2/parser/JSONPath.g4

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jsonpath2-0.3.1.tar.gz (40.3 kB view details)

Uploaded Source

Built Distribution

jsonpath2-0.3.1-py3-none-any.whl (34.6 kB view details)

Uploaded Python 3

File details

Details for the file jsonpath2-0.3.1.tar.gz.

File metadata

  • Download URL: jsonpath2-0.3.1.tar.gz
  • Upload date:
  • Size: 40.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.1

File hashes

Hashes for jsonpath2-0.3.1.tar.gz
Algorithm Hash digest
SHA256 c599b364635c02ab43341527ac8ce0096a6987a74b0997bae5ed4123cb0cf7f8
MD5 00a06a931cbd1941f01ec93c594e5b95
BLAKE2b-256 b69092efabf5519f7dd3db530fdc41b488be20ca1712ce9ca8bdc9912a5aa64e

See more details on using hashes here.

File details

Details for the file jsonpath2-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: jsonpath2-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 34.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.1

File hashes

Hashes for jsonpath2-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6756e09cca4c8d4f7c8c02e8404705c64ce1914a38e60f12a6f309430ef114ea
MD5 591e617ab6630f5381609f1a446757d3
BLAKE2b-256 48a0b14599eabf769141a482847c5c8b6f66e7a060b2591e8363c696471c21c2

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page