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.