Skip to main content

Python wrapper around rapidjson

Project description

Authors:

Ken Robbins <ken@kenrobbins.com>; Lele Gaifax <lele@metapensiero.it>

License:

MIT License

Status:

Build status Documentation status

RapidJSON is an extremely fast C++ JSON parser and serialization library: this module wraps it into a Python 3 extension, exposing its serialization/deserialization (to/from either bytes, str or file-like instances) and JSON Schema validation capabilities.

Latest version documentation is automatically rendered by Read the Docs.

Getting Started

First install python-rapidjson:

$ pip install python-rapidjson

or, if you prefer Conda:

$ conda install -c conda-forge python-rapidjson

Basic usage looks like this:

>>> import rapidjson
>>> data = {'foo': 100, 'bar': 'baz'}
>>> rapidjson.dumps(data)
'{"bar":"baz","foo":100}'
>>> rapidjson.loads('{"bar":"baz","foo":100}')
{'bar': 'baz', 'foo': 100}
>>>
>>> class Stream:
...   def write(self, data):
...      print("Chunk:", data)
...
>>> rapidjson.dump(data, Stream(), chunk_size=5)
Chunk: b'{"foo'
Chunk: b'":100'
Chunk: b',"bar'
Chunk: b'":"ba'
Chunk: b'z"}'

Development

If you want to install the development version (maybe to contribute fixes or enhancements) you may clone the repository:

$ git clone --recursive https://github.com/python-rapidjson/python-rapidjson.git

A set of makefiles implement most common operations, such as build, check and release; see make help output for a list of available targets.

Performance

python-rapidjson tries to be as performant as possible while staying compatible with the json module.

The following tables show a comparison between this module and other libraries with different data sets. Last row (“overall”) is the total time taken by all the benchmarks.

Each number shows the factor between the time taken by each contender and python-rapidjson (in other words, they are normalized against a value of 1.0 for python-rapidjson): the lower the number, the speedier the contender.

In bold the winner.

Serialization

serialize

dumps()[1]

Encoder()[2]

dumps(n)[3]

Encoder(n)[4]

ujson[5]

simplejson[6]

stdlib[7]

yajl[8]

100 arrays dict

1.00

0.97

0.75

0.75

0.92

4.15

2.16

1.29

100 dicts array

1.00

1.04

0.84

0.82

1.08

5.29

2.22

1.35

256 Trues array

1.00

1.17

1.21

1.22

1.50

2.93

2.25

1.32

256 ascii array

1.00

1.01

1.04

1.04

0.52

1.21

1.05

1.24

256 doubles array

1.00

1.02

1.12

1.02

6.94

7.90

8.26

4.02

256 unicode array

1.00

0.86

0.87

0.85

0.55

0.72

0.65

0.52

complex object

1.00

1.01

0.85

0.88

1.02

3.86

2.56

2.09

composite object

1.00

1.02

0.73

0.70

0.87

2.79

1.83

1.88

overall

1.00

0.97

0.75

0.75

0.92

4.14

2.16

1.29

Deserialization

deserialize

loads()[9]

Decoder()[10]

loads(n)[11]

Decoder(n)[12]

ujson

simplejson

stdlib

yajl

100 arrays dict

1.00

1.00

0.90

0.89

0.96

1.52

1.17

1.14

100 dicts array

1.00

1.22

0.85

0.87

0.93

2.13

1.58

1.23

256 Trues array

1.00

1.37

1.19

1.24

1.12

2.04

1.77

1.77

256 ascii array

1.00

1.03

1.03

1.04

1.38

1.22

1.17

1.41

256 doubles array

1.00

0.96

0.26

0.22

0.50

1.06

0.99

0.52

256 unicode array

1.00

1.01

1.02

1.01

1.26

5.35

6.05

2.96

complex object

1.00

1.02

0.98

0.84

1.09

1.79

1.31

1.34

composite object

1.00

1.03

0.80

0.83

0.75

2.01

1.36

1.22

overall

1.00

1.00

0.90

0.89

0.96

1.52

1.18

1.14

DIY

To run these tests yourself, clone the repo and run:

$ make benchmarks

or

$ make benchmarks-other

The former will focus only on RapidJSON and is particularly handy coupled with the compare past runs functionality of pytest-benchmark:

$ make benchmarks PYTEST_OPTIONS=--benchmark-autosave
# hack, hack, hack!
$ make benchmarks PYTEST_OPTIONS=--benchmark-compare=0001

----------------------- benchmark 'deserialize': 18 tests ------------------------
Name (time in us)                                                            Min…
----------------------------------------------------------------------------------
test_loads[rapidjson-256 Trues array] (NOW)                         5.2320 (1.0)
test_loads[rapidjson-256 Trues array] (0001)                        5.4180 (1.04)

To reproduce the tables above run make benchmarks-tables

Incompatibility

Here are things in the standard json library supports that we have decided not to support:

separators argument

This is mostly used for pretty printing and not supported by RapidJSON so it isn’t a high priority. We do support indent kwarg that would get you nice looking JSON anyways.

Coercing keys when dumping

json will stringify a True dictionary key as "true" if you dump it out but when you load it back in it’ll still be a string. We want the dump and load to return the exact same objects so we have decided not to do this coercion.

Arbitrary encodings

json.loads() accepts an encoding kwarg determining the encoding of its input, when that is a bytes or bytearray instance. Although RapidJSON is able to cope with several different encodings, we currently supports only the recommended one, UTF-8.

Changes

0.5.2 (2018-03-31)

  • Tiny tweak to restore macOS build on Travis CI

0.5.1 (2018-03-31)

  • Minor tweaks to CI and PyPI deploy configuration

0.5.0 (2018-03-31)

  • New RawJSON class, allowing inclusion of pre-serialized content (PR #95 and PR #96), thanks to Silvio Tomatis

0.4.3 (2018-01-14)

  • Deserialize from bytes and bytearray instances, ensuring they contain valid UTF-8 data

  • Speed up parsing of floating point numbers, avoiding intermediary conversion to a Python string (PR #94)

0.4.2 (2018-01-09)

  • Fix precision handling of DM_UNIX_TIME timestamps

0.4.1 (2018-01-08)

  • Fix memory leaks in Decoder() and Encoder() classes, related to bad handling of PyObject_GetAttr() result value

  • Fix compatibility with Python 3.7a

0.4.0 (2018-01-05)

  • Implemented the streaming interface, see load() and dump() (issue #80)

    Backward incompatibility: now the flags arguments on all the functions are keyword only, to mimic stdlib’s json style

0.3.2 (2017-12-21)

0.3.1 (2017-12-20)

  • Fix Travis CI recipe to accomodate MacOS

0.3.0 (2017-12-20)

  • Fix compilation on MacOS (issue #78)

  • Handle generic iterables (PR #89)

    Backward incompatibility: the dumps() function and the Encoder() constructor used to accept a max_recursion_depth argument, to control the maximum allowed nesting of Python structures; since the underlying function is now effectively recursive, it has been replaced by the generic sys.setrecursionlimit() mechanism

0.2.7 (2017-12-08)

  • Restore compatibility with Python < 3.6

0.2.6 (2017-12-08)

  • Fix memory leaks when using object_hook/start_object/end_object

0.2.5 (2017-09-30)

  • Fix bug where error handling code could raise an exception causing a confusing exception to be returned (PR #82)

  • Fix bug where loads’s object_hook and dumps’s default arguments could not be passed None explicitly (PR #83)

  • Fix crash when dealing with surrogate pairs (issue #81)

0.2.4 (2017-09-17)

  • Fix compatibility with MacOS/clang

0.2.3 (2017-08-24)

  • Limit the precision of DM_UNIX_TIME timestamps to six decimal digits

0.2.2 (2017-08-24)

  • Nothing new, attempt to fix production of Python 3.6 binary wheels

0.2.1 (2017-08-24)

  • Nothing new, attempt to fix production of Python 3.6 binary wheels

0.2.0 (2017-08-24)

  • New parse_mode option, implementing relaxed JSON syntax (issue #73)

  • New Encoder and Decoder, implementing a class-based interface

  • New Validator, exposing the underlying JSON schema validation (issue #71)

0.1.0 (2017-08-16)

  • Remove beta status

0.1.0b4 (2017-08-14)

  • Make execution of the test suite on Appveyor actually happen

0.1.0b3 (2017-08-12)

  • Exclude CI configurations from the source distribution

0.1.0b2 (2017-08-12)

  • Fix Powershell wheel upload script in appveyor configuration

0.1.0b1 (2017-08-12)

  • Compilable with somewhat old g++ (issue #69)

  • Backward incompatibilities:

    • all DATETIME_MODE_XXX constants have been shortened to DM_XXX DATETIME_MODE_ISO8601_UTC has been renamed to DM_SHIFT_TO_UTC

    • all UUID_MODE_XXX constants have been shortened to UM_XXX

  • New option DM_UNIX_TIME to serialize date, datetime and time values as UNIX timestamps targeting issue #61

  • New option DM_NAIVE_IS_UTC to treat naïve datetime and time values as if they were in the UTC timezone (also for issue #61)

  • New keyword argument number_mode to use underlying C library numbers

  • Binary wheels for GNU/Linux and Windows on PyPI (one would hope: this is the reason for the beta1 release)

0.0.11 (2017-03-05)

  • Fix a couple of refcount handling glitches, hopefully targeting issue #48.

0.0.10 (2017-03-02)

  • Fix source distribution to contain all required stuff (PR #64)

0.0.9 (2017-03-02)

0.0.8 (2016-12-09)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python-rapidjson-0.5.2.tar.gz (183.5 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

python_rapidjson-0.5.2-cp36-cp36m-win_amd64.whl (122.0 kB view details)

Uploaded CPython 3.6mWindows x86-64

python_rapidjson-0.5.2-cp36-cp36m-win32.whl (106.8 kB view details)

Uploaded CPython 3.6mWindows x86

python_rapidjson-0.5.2-cp36-cp36m-manylinux1_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.6m

python_rapidjson-0.5.2-cp36-cp36m-manylinux1_i686.whl (1.0 MB view details)

Uploaded CPython 3.6m

python_rapidjson-0.5.2-cp36-cp36m-macosx_10_6_intel.whl (357.4 kB view details)

Uploaded CPython 3.6mmacOS 10.6+ Intel (x86-64, i386)

python_rapidjson-0.5.2-cp35-cp35m-win_amd64.whl (122.0 kB view details)

Uploaded CPython 3.5mWindows x86-64

python_rapidjson-0.5.2-cp35-cp35m-win32.whl (106.8 kB view details)

Uploaded CPython 3.5mWindows x86

python_rapidjson-0.5.2-cp35-cp35m-manylinux1_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.5m

python_rapidjson-0.5.2-cp35-cp35m-manylinux1_i686.whl (1.0 MB view details)

Uploaded CPython 3.5m

python_rapidjson-0.5.2-cp35-cp35m-macosx_10_6_intel.whl (357.4 kB view details)

Uploaded CPython 3.5mmacOS 10.6+ Intel (x86-64, i386)

python_rapidjson-0.5.2-cp34-cp34m-win_amd64.whl (116.1 kB view details)

Uploaded CPython 3.4mWindows x86-64

python_rapidjson-0.5.2-cp34-cp34m-win32.whl (104.6 kB view details)

Uploaded CPython 3.4mWindows x86

python_rapidjson-0.5.2-cp34-cp34m-manylinux1_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.4m

python_rapidjson-0.5.2-cp34-cp34m-manylinux1_i686.whl (1.0 MB view details)

Uploaded CPython 3.4m

python_rapidjson-0.5.2-cp34-cp34m-macosx_10_6_intel.whl (356.0 kB view details)

Uploaded CPython 3.4mmacOS 10.6+ Intel (x86-64, i386)

File details

Details for the file python-rapidjson-0.5.2.tar.gz.

File metadata

File hashes

Hashes for python-rapidjson-0.5.2.tar.gz
Algorithm Hash digest
SHA256 6d822db35b13155a62f4b36ab67bf58e3cd0a58d78932f8a895b1304d226b754
MD5 154cd1b3760c4a97d57ae36c78d09f4e
BLAKE2b-256 5449e4baa74c2e281208365bdcb016d30b5d0c00bf4163ccf878e35fb64e949f

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp36-cp36m-win_amd64.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 c80123b55561435566a712934613bf4123515865df515947717b548fbf2313e3
MD5 4cfcd693e80c8f8a18a7860ed27267a6
BLAKE2b-256 4d19292dfd2fa71ea3ce8490960db9f3b5406b34a491bfc20ccbab0f75070699

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp36-cp36m-win32.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 d882ee87149a9f32899529d81bb9eada2bd82c71efe590ce60a68e1c2e205318
MD5 07af9edae07e25bd0a06f204057e2b8c
BLAKE2b-256 4171a56974b5483324deff36b53b60eb1164036eb011a0446a96bc8f37e81c75

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ab23b80bc42c6fb1b750914f9e1d41ddfd797131a9ddff1abd61017b41f50bbd
MD5 1f0b02d5988ce9c9bd68adebd34b2910
BLAKE2b-256 a394cb56fe9b6f66faef7ef9e00df6cc148b56b9bf079726683a28bc867311ae

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp36-cp36m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 6ed13999153d82e8345f027d5209a78355a299859a4fb4ef62ac5d7f6c2bfccd
MD5 a02911a3581e8706585bff3ac8b859ad
BLAKE2b-256 89b238897001b0b520fe64abf1fddd4fda1ec5fbe2f204529b97118bc01a8d65

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp36-cp36m-macosx_10_6_intel.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp36-cp36m-macosx_10_6_intel.whl
Algorithm Hash digest
SHA256 d9a2a458a6eaee8367a20029742494eb36c354a651f84ea0bd780fda562d9e16
MD5 88ba2890b44cc930d600b76871adf0b8
BLAKE2b-256 9acb419843ac9a441143bcf23d75ae1a00a7646f39f786a96e6e79efee413a7c

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp35-cp35m-win_amd64.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 7c2606c0071d9672cfce1ced2902c52559f42a8c504d033f86e5236b3b6c40ac
MD5 bd9e41a720d2d480025677cf01d455ab
BLAKE2b-256 c74ae1f9c94a603be8c64bf3e799890242f9c35dc38b0a03ed91f0117895ce22

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp35-cp35m-win32.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 8874c74caf92a17ff8063917c112d686bc7b7e272d00711abcb89a2665a52ed7
MD5 6523e49199f38dfdd468a4532216b20c
BLAKE2b-256 b97bc5afc3d3beb3615ddcd2cb41d2b06f50fdeaf3acf14a158ef1871e15eae1

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d20ca8dfd9db296941c1f978231ddf9402494c868ae8d6e431b59c8406063cad
MD5 77ceb2b31099c774b9c037cf05bbc38f
BLAKE2b-256 445970b5060b7a5afaec36cdb618dd1c59a389642e739a49b76fef81446f18f8

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp35-cp35m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 4c5cd9e5a71bd64115f96190a129721661caea38c1779cb83a5dbd96129dc23a
MD5 f5a7d8af743661ad11377d3b0d6bd1b0
BLAKE2b-256 918b0757d4d2c23662fff4f87b5ce02d54e86e0f2b633564330fe7d5db8a59e7

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp35-cp35m-macosx_10_6_intel.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp35-cp35m-macosx_10_6_intel.whl
Algorithm Hash digest
SHA256 c3ac31e7c6b3b8d6d2565243adf09f12c3b1bc31d1744e49ab69e336bf2bab00
MD5 e339b0af9050c99ed22f1a5fed0f0013
BLAKE2b-256 2d7e957636c911165590f04cf7870c6334058268097e11088cf2acc22a0071b3

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp34-cp34m-win_amd64.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 00fc181eb5807cbbd807a15e4c774b886e8da71b342826276ccf4424bf747909
MD5 3a9a9a4c65e87e032e4a83b4329b3117
BLAKE2b-256 1cf0c104a5aab9ab5d9f9a277096be6a4e2cd6335a2af787161999fe1ff61f60

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp34-cp34m-win32.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 73943b37f3f3221120d7dfe7eec15b7c9506199345d953f7aa8e438eed7537a0
MD5 82fe8ca0900761e76c36bdd0a302cd1d
BLAKE2b-256 27b1c17d93d66a03de64014f83b068b0b841a3b2e40ae55dccc14e7d2ad94fd2

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp34-cp34m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp34-cp34m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 1e5baf3f3a87e6dc23ae65907746684b84ff53797502bfb330b6d9c6a4a1aaf3
MD5 1bdefe562e1a9d0f95c2aa5b2d65a1a6
BLAKE2b-256 24469af30d342d6990511dde8eba68ab0827a1ad1137b638f0e33150954e54b7

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp34-cp34m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp34-cp34m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 1918a8d89b905ada2bc9d5fdc3630291efdc0b33cc359010f65ff3fc58b42c1d
MD5 1f4c46d24901f22bda651cc21eabd904
BLAKE2b-256 155b2207ae36920a1f185f29591ed6fd1d95ca47e0de1e53dffb2e108f4d1e87

See more details on using hashes here.

File details

Details for the file python_rapidjson-0.5.2-cp34-cp34m-macosx_10_6_intel.whl.

File metadata

File hashes

Hashes for python_rapidjson-0.5.2-cp34-cp34m-macosx_10_6_intel.whl
Algorithm Hash digest
SHA256 7ddcbc3cee1436a33c64ed2bb26a5a95f4d6669c1e716086817c8a421b5b40d1
MD5 bf479fcaebe8f3d4d20e15fcf1f4e07b
BLAKE2b-256 3bf581f75f23245ae0772b26503aed7a63b9bd8335f4de521a81eabb18e8c1bd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page