1
0
Fork 0
mirror of https://github.com/ultrajson/ultrajson.git synced 2024-05-22 16:26:17 +02:00
ultrajson/README.md

7.6 KiB

UltraJSON

PyPI version Supported Python versions PyPI downloads GitHub Actions status codecov DOI Code style: Black

UltraJSON is an ultra fast JSON encoder and decoder written in pure C with bindings for Python 3.7+.

Install with pip:

python -m pip install ujson

Usage

May be used as a drop in replacement for most other JSON parsers for Python:

>>> import ujson
>>> ujson.dumps([{"key": "value"}, 81, True])
'[{"key":"value"},81,true]'
>>> ujson.loads("""[{"key": "value"}, 81, true]""")
[{'key': 'value'}, 81, True]

Encoder options

encode_html_chars

Used to enable special encoding of "unsafe" HTML characters into safer Unicode sequences. Default is False:

>>> ujson.dumps("<script>John&Doe", encode_html_chars=True)
'"\\u003cscript\\u003eJohn\\u0026Doe"'

ensure_ascii

Limits output to ASCII and escapes all extended characters above 127. Default is True. If your end format supports UTF-8, setting this option to false is highly recommended to save space:

>>> ujson.dumps("åäö")
'"\\u00e5\\u00e4\\u00f6"'
>>> ujson.dumps("åäö", ensure_ascii=False)
'"åäö"'

escape_forward_slashes

Controls whether forward slashes (/) are escaped. Default is True:

>>> ujson.dumps("http://esn.me")
'"http:\\/\\/esn.me"'
>>> ujson.dumps("http://esn.me", escape_forward_slashes=False)
'"http://esn.me"'

indent

Controls whether indentation ("pretty output") is enabled. Default is 0 (disabled):

>>> ujson.dumps({"foo": "bar"})
'{"foo":"bar"}'
>>> print(ujson.dumps({"foo": "bar"}, indent=4))
{
    "foo":"bar"
}

Benchmarks

UltraJSON calls/sec compared to other popular JSON parsers with performance gain specified below each.

Test machine

Linux 5.15.0-1037-azure x86_64 #44-Ubuntu SMP Thu Apr 20 13:19:31 UTC 2023

Versions

  • CPython 3.11.3 (main, Apr 6 2023, 07:55:46) [GCC 11.3.0]
  • ujson : 1.36.dev558
  • orjson : 3.9.0
  • simplejson : 3.19.1
  • json : 2.0.9
ujson orjson simplejson json
Array with 256 doubles
encode 16,268 67,856 4,113 4,144
decode 20,055 72,031 10,059 10,158
Array with 256 UTF-8 strings
encode 2,468 24,117 2,337 2,437
decode 2,472 2,860 364 1,393
Array with 256 strings
encode 37,144 110,032 15,895 18,304
decode 25,211 59,879 32,200 32,933
Medium complex object
encode 6,501 38,501 3,025 4,415
decode 9,518 18,114 5,901 7,286
Array with 256 True values
encode 83,830 324,140 65,395 66,498
decode 162,760 281,594 118,120 125,927
Array with 256 dict{string, int} pairs
encode 9,265 58,508 2,295 5,504
decode 12,911 20,799 7,110 9,592
Dict with 256 arrays with 256 dict{string, int} pairs
encode 35 232 7 19
decode 31 34 18 22
Dict with 256 arrays with 256 dict{string, int} pairs, outputting sorted keys
encode 27 6 20
Complex object
encode 448 341 396
decode 468 591 162 266

Above metrics are in call/sec, larger is better.

Build options

For those with particular needs, such as Linux distribution packagers, several build options are provided in the form of environment variables.

Debugging symbols

UJSON_BUILD_NO_STRIP

By default, debugging symbols are stripped on Linux platforms. Setting this environment variable with a value of 1 or True disables this behavior.

Using an external or system copy of the double-conversion library

These two environment variables are typically used together, something like:

export UJSON_BUILD_DC_INCLUDES='/usr/include/double-conversion'
export UJSON_BUILD_DC_LIBS='-ldouble-conversion'

Users planning to link against an external shared library should be aware of the ABI-compatibility requirements this introduces when upgrading system libraries or copying compiled wheels to other machines.

UJSON_BUILD_DC_INCLUDES

One or more directories, delimited by os.pathsep (same as the PATH environment variable), in which to look for double-conversion header files; the default is to use the bundled copy.

UJSON_BUILD_DC_LIBS

Compiler flags needed to link the double-conversion library; the default is to use the bundled copy.