Skip to content

Releases: jg-rp/python-jsonpath

Version 1.0.0

23 Feb 11:50

Choose a tag to compare

RFC 9535 (JSONPath: Query Expressions for JSON) is now out, replacing the draft IETF JSONPath base.

Breaking Changes

  • The undocumented keys function extension is no longer enabled by default. A new, well-typed keys function is planned for the future.

Fixes

  • The lexer now sorts environment-controlled tokens by their length in descending order. This allows one custom token to be a prefix of another.

Features

  • Added the non-standard "fake root" identifier, which defaults to ^ and can be customized with the fake_root_token attribute on a JSONPathEnvironment subclass. Using the fake root identifier is equivalent to the standard root identifier ($), but wraps the target JSON value in an array, so the root value can be conditionally selected using a filter.
  • Non-standard environment-controlled tokens can now be disabled by setting them to the empty string.

Version 0.10.3

02 Jan 16:08
51ec96b

Choose a tag to compare

Breaking Changes

  • Changed the exception raised when attempting to compare a non-singular filter query from JSONPathSyntaxError to JSONPathTypeError.

Fixes

  • Fixed handling of relative and root queries when used as arguments to filter functions. Previously, when those queries resulted in an empty node list, we were converting them to an empty regular list before passing it to functions that accept ValueType arguments. Now, in such cases, we convert empty node lists to the special result Nothing, which is required by the spec.
  • Fixed well-typedness checks on JSONPath logical expressions (those that involve && or ||) and non-singular filter queries. Previously we were erroneously applying the checks for comparison expressions to logical expressions too. Now non-singular queries in logical expressions act as an existence test. See #45.

Version 0.10.2

13 Oct 10:52

Choose a tag to compare

Fixes

  • Fixed precedence of the logical not operator in JSONPath filter expressions. Previously, logical or and logical and had priority over not. See #41.

Version 0.10.1

08 Oct 15:53
6f9e3be

Choose a tag to compare

Hot fix

  • Fixed priority of JSONPath lexer rules. Previously, standard short tokens (like * and ?) had a higher priority than environment controlled tokens (like JSONPathEnvironment.keys_selector_token), making it impossible to incorporate short token characters into longer environment-controlled tokens.

Version 0.10.0

02 Oct 07:12

Choose a tag to compare

Breaking Changes

  • We now enforce JSONPath filter expression "well-typedness" by default. That is, filter expressions are checked at compile time according to the IETF JSONPath Draft function extension type system and rules regarding non-singular query usage. If an expression is deemed to not be well-typed, a JSONPathTypeError is raised. This can be disabled in Python JSONPath by setting the well_typed argument to JSONPathEnvironment to False, or using --no-type-checks on the command line. See #33.
  • The JSONPath lexer and parser have been refactored to accommodate #30. As a result, the tokens generated by the lexer and the ATS built by the parser have changed significantly. In the unlikely event that anyone is customizing the lexer or parser through subclassing, please open an issue and I'll provide more details.
  • Changed the normalized representation of JSONPath string literals to use double quotes instead of single quotes.
  • Changed the normalized representation of JSONPath filter expressions to not include parentheses unless the expression includes one or more logical operators.
  • The built-in implementation of the standard length() filter function is now a class and is renamed to jsonpath.function_extensions.Length.
  • The built-in implementation of the standard value() filter function is now a class and is renamed to jsonpath.function_extensions.Value.

Fixes

  • We no longer silently ignore invalid escape sequences in JSONPath string literals. For example, $['\"'] used to be OK, it now raises a JSONPathSyntaxError. See #31.
  • Fixed parsing of JSONPath integer literals that use scientific notation. Previously we raised a JSONPathSyntaxError for literals such as 1e2.
  • Fixed parsing of JSONPath comparison and logical expressions as filter function arguments. Previously we raised a JSONPathSyntaxError if a comparison or logical expression appeared as a filter function argument. Note that none of the built-in, standard filter functions accept arguments of LogicalType.
  • Fixed parsing of nested JSONPath filter functions, where a function is used as an argument to another.
  • Fixed JSONPath bracketed segments. We now handle an arbitrary number of filter selectors alongside name, index, slice and wildcard selectors, separated by commas. See #30.

Version 0.9.0

22 Jul 12:42

Choose a tag to compare

Breaking Changes

  • CompoundJSONPath instances are no longer updated in-place when using .union() and .intersection(). Instead, a new CompoundJSONPath is returned. CompoundJSONPath.paths is now a tuple instead of a list.

Fixes

  • Fixed a bug with the parsing of JSON Pointers. When given an arbitrary string without slashes, JSONPointer would resolve to the document root. The empty string is the only valid pointer that should resolve to the document root. We now raise a JSONPointerError in such cases. See #27.
  • Fixed handling of JSON documents containing only a top-level string.

Features

  • Added a command line interface, exposing JSONPath, JSON Pointer and JSON Patch features (docs, source).
  • Added JSONPointer.parent(), a method that returns the parent of the pointer, as a new JSONPointer (docs).
  • Implemented JSONPointer.__truediv__() to allow creation of child pointers from an existing pointer using the slash (/) operator (docs).
  • Added JSONPointer.join(), a method for creating child pointers. This is equivalent to using the slash (/) operator for each argument given to join() (docs).
  • Added JSONPointer.exists(), a method that returns True if a the pointer can be resolved against some data, or False otherwise (docs).
  • Added the RelativeJSONPointer class for building new JSONPointer instances from Relative JSON Pointer syntax (docs, API).
  • Added support for a non-standard index/property pointer using #<property or index>. This is to support Relative JSON Pointer's use of hash (#) when building JSONPointer instances from relative JSON Pointers.
  • Added the unicode_escape argument to JSONPathEnvironment. When True (the default), UTF-16 escaped sequences found in JSONPath string literals will be decoded.

Version 0.8.1

07 Jul 06:20
fc239b9

Choose a tag to compare

Fixes

  • Fixed the string representation of a JSONPointer when built using JSONPointer.from_parts() and pointing to the document root. See #21.

Version 0.8.0

30 Jun 06:34

Choose a tag to compare

Breaking changes

  • Changed the JSONPathMatch.parts representation of the non-standard keys selector (default ~) to be ~ followed by the key name. It used to be two "parts", ~ and key index.
  • All FilterExpression subclasses must now implement children() and set_children(). These methods facilitate filter expression inspection and caching.

Fixes

  • Changed findall() and finditer() to accept data arguments of any io.IOBase subclass, not just TextIO.

Features

  • Added the JSONPointer class and methods for converting a JSONPathMatch to a JSONPointer. JSONPointer is compliant with RFC 6901 (docs).
  • Added the JSONPatch class. JSONPatch implements RFC 6902 (docs).
  • Added jsonpath.pointer.resolve(), a convenience function for resolving a JSON Pointer (docs).
  • Added jsonpath.patch.apply(), a convenience function for applying a JSON Patch (docs).
  • Added jsonpath.match(), a convenience function returning a JSONPathMatch instance for the first match of a path, or None if there were no matches (docs).
  • Added filter expression caching. Controlled with the filter_caching argument to JSONPathEnvironment, filter expression caching is enabled by default. See [#14]
  • All selectors now use env.match_class to instantiate new JSONPathMatch objects. This allows for subclassing of JSONPathMatch.
  • Added jsonpath.filter.walk() for the benefit of filter expression static analysis.

Version 0.7.1

02 Jun 06:35

Choose a tag to compare

Fixes

  • Fixed a bug with the filter context selector (default _) when it's used as a filter function argument.

Version 0.7.0

31 May 05:55

Choose a tag to compare

Breaking changes

  • JSONPathIndexError now requires a token parameter. It used to be optional.
  • Filter expressions that resolve JSON paths (like SelfPath and RootPath) now return a NodeList. The node list must then be explicitly unpacked by JSONPathEnvironment.compare() and any filter function that has a with_node_lists attribute set to True. This is done for the benefit of the count() filter function and standards compliance.

Features

  • missing is now an allowed alias of undefined when using the isinstance() filter function.

IETF JSONPath Draft compliance

  • The built-in count() filter function is now compliant with the standard, operating on a "nodelist" instead of node values.