A Python implementation of the JSON5 data format.
JSON5 extends the JSON data interchange format to make it slightly more usable as a configuration language:
JavaScript-style comments (both single and multi-line) are legal.
Object keys may be unquoted if they are legal ECMAScript identifiers
Objects and arrays may end with trailing commas.
Strings can be single-quoted, and multi-line string literals are allowed.
There are a few other more minor extensions to JSON; see the above page for the full details.
This project implements a reader and writer implementation for Python; where possible, it mirrors the standard Python JSON API package for ease of use.
There is one notable difference from the JSON api: the load()
and loads()
methods support optionally checking for (and rejecting) duplicate object keys; pass allow_duplicate_keys=False
to do so (duplicates are allowed by default).
This is an early release. It has been reasonably well-tested, but it is SLOW. It can be 1000-6000x slower than the C-optimized JSON module, and is 200x slower (or more) than the pure Python JSON module.
Please Note: This library only handles JSON5 documents, it does not allow you to read arbitrary JavaScript. For example, bare integers can be legal object keys in JavaScript, but they aren't in JSON5.
Did I mention that it is SLOW?
The implementation follows Python3's json
implementation where possible. This means that the encoding
method to dump()
is ignored, and unicode strings are always returned.
The cls
keyword argument that json.load()
/json.loads()
accepts to specify a custom subclass of JSONDecoder
is not and will not be supported, because this implementation uses a completely different approach to parsing strings and doesn't have anything like the JSONDecoder
class.
The cls
keyword argument that json.dump()
/json.dumps()
accepts is also not supported, for consistency with json5.load()
. The default
keyword is supported, though, and might be able to serve as a workaround.
To run the tests, setup a venv and install the required dependencies with pip install -e '.[dev]'
, then run the tests with python setup.py test
.
v0.9.14 (2023-05-14)
+Infinity
as well as -Infinity
and Infinity
.v0.9.13 (2023-03-16)
v0.9.12 (2023-01-02)
v0.9.11 (2023-01-02)
float("inf")
instead of math.inf
.v0.9.10 (2022-08-18)
v0.9.9 (2022-08-01)
int
or float
: Previously we would use the objects str implementation, but that might result in an illegal JSON5 value if the object had customized str to return something illegal. Instead, we follow the lead of the JSON
module and call int.__repr__
or float.__repr__
directly.allow_nan=False
.v0.9.8 (2022-05-08)
v0.9.7 (2022-05-06)
default
fn in dump
and dumps
. Previously we didn‘t require the function to return a string, and so we could end up returning something that wasn’t actually valid. This change now matches the behavior in the json
module. Note: This is a potentially breaking change.v0.9.6 (2021-06-21)
hypothesis
isn't installed.v0.9.5 (2020-05-26)
v0.9.4 (2020-03-26)
v0.9.3 (2020-03-17)
v0.9.2 (2020-03-02)
v0.9.1 (2020-02-09)
v0.9.0 (2020-01-30)
dump()
/dumps()
. Add an allow_duplicate_keys=False
to prevent possible ill-formed JSON that might result.v0.8.5 (2019-07-04)
v0.8.4 (2019-06-11)
v0.8.3 (2019-06-11)
v0.8.2 (2019-06-11)
v0.8.1 (2019-06-11)
v0.8.0 (2019-06-11)
allow_duplicate_keys=True
as a default argument to json5.load()
/json5.loads()
. If you set the key to False
, duplicate keys in a single dict will be rejected. The default is set to True
for compatibility with json.load()
, earlier versions of json5, and because it's simply not clear if people would want duplicate checking enabled by default.v0.7 (2019-03-31)
quote_keys=True
will turn that off and always quote object keys.indent
is not None). Passing trailing_commas=False
will turn that off.json5.tool
command line tool now supports the --indent
, --[no-]quote-keys
, and --[no-]trailing-commas
flags to allow for more control over the output, in addition to the existing --as-json
flag.json5.tool
command line tool no longer supports reading from multiple files, you can now only read from a single file or from standard input.json
module for anything. The output should still match the json module (except as noted above) and discrepancies should be reported as bugs.v0.6.2 (2019-03-08)
v0.6.1 (2018-05-22)
v0.6.0 (2017-11-28)
v0.5.0 (2017-09-04)
json
module supports.