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.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.0.tar.gz (183.3 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.0-cp36-cp36m-win_amd64.whl (121.9 kB view details)

Uploaded CPython 3.6mWindows x86-64

python_rapidjson-0.5.0-cp36-cp36m-win32.whl (106.7 kB view details)

Uploaded CPython 3.6mWindows x86

python_rapidjson-0.5.0-cp35-cp35m-win_amd64.whl (121.9 kB view details)

Uploaded CPython 3.5mWindows x86-64

python_rapidjson-0.5.0-cp35-cp35m-win32.whl (106.7 kB view details)

Uploaded CPython 3.5mWindows x86

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

Uploaded CPython 3.5m

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

Uploaded CPython 3.5m

python_rapidjson-0.5.0-cp34-cp34m-win_amd64.whl (116.0 kB view details)

Uploaded CPython 3.4mWindows x86-64

python_rapidjson-0.5.0-cp34-cp34m-win32.whl (104.5 kB view details)

Uploaded CPython 3.4mWindows x86

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

Uploaded CPython 3.4m

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

Uploaded CPython 3.4m

File details

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

File metadata

File hashes

Hashes for python-rapidjson-0.5.0.tar.gz
Algorithm Hash digest
SHA256 c336dd261c6db8736052c6838d2272bcb3e316da3f477c9871cf9e10ef7e0743
MD5 6a546638fe8335dec6aa2d8c630ea874
BLAKE2b-256 1a2feeb1b6b1b93938c84e15f932e7297e473589d4a17db643c91d203639448b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_rapidjson-0.5.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 36e1ebe1c0d14075526ab6561dfd8e35888ac0df5036e486fc4ec395aa5464b8
MD5 f4e4d275110e326284ff602c72b66e7e
BLAKE2b-256 51fb0d50e448b750b675c042ad334cd57568b244cdf8249a79c35a9aaf2fad27

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_rapidjson-0.5.0-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 23f4e8d9776d768945954956c6f45e2ee5e0619e00f7c130bf9525b7033bf764
MD5 f9542465fc5481be7a459636cb4edb4e
BLAKE2b-256 f963c5147170f835a567b37e07d3269cd96d1f5e5269a0f44f265854dd00be99

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_rapidjson-0.5.0-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 e316859ef992100fc56dc2349421a695e7c309ceee2a83d23d8c4c75dbfa7f14
MD5 95ec43b9563f4f32c9a71f96f1bba555
BLAKE2b-256 429d084cd7b37d76a42fdd1e7411c266353f4e12fe4f28617ee1d07c465ec67c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_rapidjson-0.5.0-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 e700bb45eaacd6e4b062d321e7b2b4857199bdd7db8b1639bbf21868a186cc73
MD5 1bfba0bc6b9ff954f57d96dec5d766a3
BLAKE2b-256 5cefcb1498e9eed6d6ff2ef12cbbb7dc79d8b675bbd88e6dafd176e2bc21d45b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_rapidjson-0.5.0-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 1eb3f53e4bcb2673c0cd727c87935de681bdfb1b02a63119d2c3a6ceaef41c30
MD5 bac5336d5a730f501439e74cd338f6c7
BLAKE2b-256 cce7e50c88cc1b2406526aff52c890766c2a16cfc2f4dc1a3c0617570d223a34

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_rapidjson-0.5.0-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 d0e234d481e223d11765b0006b4dad1f423f15facc48de878ac945902ba5462c
MD5 3353f32c1208cbab604a181acd31b28f
BLAKE2b-256 8fae1a76864cd876b83945c34bf05cd696f8a7fcbed93f4806599cebaf451b67

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_rapidjson-0.5.0-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 ab8e0dbcd435e76c89eaef7502551db90ee353d9564c03500015af173c5f13d2
MD5 e5d3cea9cc23ed2137e896480e1349cb
BLAKE2b-256 714cd592f8f7e8cbb65452319bf8d04d2643588b767ff13b27df83345b80ff93

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_rapidjson-0.5.0-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 c535c5e7ea446d93581dd2453e3c67dbed175396a385e7116aebd24d1c7bfb63
MD5 5a27527ea34c020c23cd4f4fab33626a
BLAKE2b-256 f89c0074346926b5574a35349fd89e8948dff156da9eb337d569cb9ae6f2b184

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_rapidjson-0.5.0-cp34-cp34m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 b834dcd7eae481959896d4c80118ec6200b2c6cde1b7e5b3fb1105a14514301c
MD5 e074b6f9ba67bbca190d918a5b51d73e
BLAKE2b-256 167713e6f2ad1fdc57b2039f0f4b8392bd4c5fe832f1be96e64b056b9713d201

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for python_rapidjson-0.5.0-cp34-cp34m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 47d17767168a3e3988dc6e8571ec7102f91892d59f292c9bebed9371d22dd73d
MD5 6fecf44f2c8b822cac6d445386b054bc
BLAKE2b-256 1d4c0a242429cd1635ec6311bcb6d1bd555a10ad2cdf5473ca711b01daf394a2

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