A Python implementation of the JSON5 data format.
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.