1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
Canonical JSON
==============
.. image:: https://img.shields.io/pypi/v/canonicaljson.svg
:target: https://pypi.python.org/pypi/canonicaljson/
:alt: Latest Version
Features
--------
* Encodes objects and arrays as `RFC 7159`_ JSON.
* Sorts object keys so that you get the same result each time.
* Has no insignificant whitespace to make the output as small as possible.
* Escapes only the characters that must be escaped, U+0000 to U+0019 / U+0022 /
U+0056, to keep the output as small as possible.
* Uses the shortest escape sequence for each escaped character.
* Encodes the JSON as UTF-8.
* Can be configured to encode custom types unknown to the stdlib JSON encoder.
Supports Python versions 3.7 and newer.
.. _`RFC 7159`: https://tools.ietf.org/html/rfc7159
Installing
----------
.. code:: bash
pip install canonicaljson
Using
-----
To encode an object into the canonicaljson:
.. code:: python
import canonicaljson
assert canonicaljson.encode_canonical_json({}) == b'{}'
There's also an iterator version:
.. code:: python
import canonicaljson
assert b''.join(canonicaljson.iterencode_canonical_json({})) == b'{}'
The underlying JSON implementation can be chosen with the following:
.. code:: python
import json
import canonicaljson
canonicaljson.set_json_library(json)
.. note::
By default canonicaljson uses `simplejson`_ under the hood (except for PyPy,
which uses the standard library json module).
.. _simplejson: https://simplejson.readthedocs.io/
A preserialisation hook allows you to encode objects which aren't encodable by the
standard library ``JSONEncoder``.
.. code:: python
import canonicaljson
from typing import Dict
class CustomType:
pass
def callback(c: CustomType) -> Dict[str, str]:
return {"Hello": "world!"}
canonicaljson.register_preserialisation_callback(CustomType, callback)
assert canonicaljson.encode_canonical_json(CustomType()) == b'{"Hello":"world!"}'
|