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!"}'
Raw data
{
"_id": null,
"home_page": "https://github.com/matrix-org/python-canonicaljson",
"name": "canonicaljson",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": "",
"keywords": "json",
"author": "Matrix.org Team and Contributors",
"author_email": "packages@matrix.org",
"download_url": "https://files.pythonhosted.org/packages/a8/f2/2835b7ab464988d1f85e351a19c4d6b2e4c317ba8484ebd2a311850eab8c/canonicaljson-2.0.0.tar.gz",
"platform": null,
"description": "Canonical JSON\n==============\n\n.. image:: https://img.shields.io/pypi/v/canonicaljson.svg\n :target: https://pypi.python.org/pypi/canonicaljson/\n :alt: Latest Version\n\nFeatures\n--------\n\n* Encodes objects and arrays as `RFC 7159`_ JSON.\n* Sorts object keys so that you get the same result each time.\n* Has no insignificant whitespace to make the output as small as possible.\n* Escapes only the characters that must be escaped, U+0000 to U+0019 / U+0022 /\n U+0056, to keep the output as small as possible.\n* Uses the shortest escape sequence for each escaped character.\n* Encodes the JSON as UTF-8.\n* Can be configured to encode custom types unknown to the stdlib JSON encoder.\n\nSupports Python versions 3.7 and newer.\n\n.. _`RFC 7159`: https://tools.ietf.org/html/rfc7159\n\nInstalling\n----------\n\n.. code:: bash\n\n pip install canonicaljson\n\nUsing\n-----\n\nTo encode an object into the canonicaljson:\n\n.. code:: python\n\n import canonicaljson\n assert canonicaljson.encode_canonical_json({}) == b'{}'\n\nThere's also an iterator version:\n\n.. code:: python\n\n import canonicaljson\n assert b''.join(canonicaljson.iterencode_canonical_json({})) == b'{}'\n\nThe underlying JSON implementation can be chosen with the following:\n\n.. code:: python\n\n import json\n import canonicaljson\n canonicaljson.set_json_library(json)\n\n.. note::\n\n By default canonicaljson uses `simplejson`_ under the hood (except for PyPy,\n which uses the standard library json module).\n\n.. _simplejson: https://simplejson.readthedocs.io/\n\nA preserialisation hook allows you to encode objects which aren't encodable by the\nstandard library ``JSONEncoder``.\n\n.. code:: python\n\n import canonicaljson\n from typing import Dict\n\n class CustomType:\n pass\n\n def callback(c: CustomType) -> Dict[str, str]:\n return {\"Hello\": \"world!\"}\n\n canonicaljson.register_preserialisation_callback(CustomType, callback)\n assert canonicaljson.encode_canonical_json(CustomType()) == b'{\"Hello\":\"world!\"}'\n",
"bugtrack_url": null,
"license": "Apache License, Version 2.0",
"summary": "Canonical JSON",
"version": "2.0.0",
"split_keywords": [
"json"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "e554346f681c24a9c3a08e2e74dcee2555ccd1081705b46f791f7b228e177d06",
"md5": "1179236239f9d7350bc59f9d027d2e6d",
"sha256": "c38a315de3b5a0532f1ec1f9153cd3d716abfc565a558d00a4835428a34fca5b"
},
"downloads": -1,
"filename": "canonicaljson-2.0.0-py3-none-any.whl",
"has_sig": true,
"md5_digest": "1179236239f9d7350bc59f9d027d2e6d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 7921,
"upload_time": "2023-03-15T01:51:50",
"upload_time_iso_8601": "2023-03-15T01:51:50.931773Z",
"url": "https://files.pythonhosted.org/packages/e5/54/346f681c24a9c3a08e2e74dcee2555ccd1081705b46f791f7b228e177d06/canonicaljson-2.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a8f22835b7ab464988d1f85e351a19c4d6b2e4c317ba8484ebd2a311850eab8c",
"md5": "ea60a3f3c99e3382c62606f86c08caae",
"sha256": "e2fdaef1d7fadc5d9cb59bd3d0d41b064ddda697809ac4325dced721d12f113f"
},
"downloads": -1,
"filename": "canonicaljson-2.0.0.tar.gz",
"has_sig": true,
"md5_digest": "ea60a3f3c99e3382c62606f86c08caae",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 10716,
"upload_time": "2023-03-15T01:51:52",
"upload_time_iso_8601": "2023-03-15T01:51:52.883625Z",
"url": "https://files.pythonhosted.org/packages/a8/f2/2835b7ab464988d1f85e351a19c4d6b2e4c317ba8484ebd2a311850eab8c/canonicaljson-2.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-03-15 01:51:52",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "matrix-org",
"github_project": "python-canonicaljson",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "canonicaljson"
}