Ultra fast JSON decoder and encoder written in C with Python bindings
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Hugo van Kemenade e999525b00
Merge pull request #459 from hugovk/rm-unused
1 week ago
.github Add codecov upload to CI/CD. 2 weeks ago
deps/double-conversion Lint end-of-file-fixer 11 months ago
lib Remove unused variable 2 weeks ago
python Match Python json output for exponents 5 months ago
scripts Drop colored gcov output on Linux. 2 weeks ago
tests [pre-commit.ci] auto fixes from pre-commit.com hooks 1 week ago
.gitignore Add gcov coverage collecting of C code (#387) 3 weeks ago
.pre-commit-config.yaml [pre-commit.ci] pre-commit autoupdate 1 week ago
.travis.yml Only test oldest and newest Python on Travis CI 5 months ago
LICENSE.txt Lint end-of-file-fixer 11 months ago
MANIFEST.in include license file in manifest 1 year ago
README.rst Remove dollar for easier copy/paste 2 months ago
RELEASING.md Update release checklist now wheels are built and deployed from CI 11 months ago
pyproject.toml Update pre-commit 7 months ago
setup.cfg Update pre-commit 7 months ago
setup.py Fix UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2116: ordinal not in range(128) 6 months ago

README.rst

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> </head>

UltraJSON

Travis CI status

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

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.0.0-1032-azure x86_64 #34-Ubuntu SMP Mon Feb 10 19:37:25 UTC 2020

Versions:

  • CPython 3.8.2 (default, Feb 28 2020, 14:28:43) [GCC 7.4.0]
  • nujson : 1.35.2
  • orjson : 2.6.1
  • simplejson: 3.17.0
  • ujson : 2.0.2
  ujson nujson orjson simplejson json
Array with 256 doubles          
encode 22,082 4,282 76,975 5,328 5,436
decode 24,127 34,349 29,059 14,174 13,822
Array with 256 UTF-8 strings          
encode 3,557 2,528 24,300 3,061 2,068
decode 2,030 2,490 931 406 358
Array with 256 strings          
encode 39,041 31,769 76,403 16,615 16,910
decode 25,185 24,287 34,437 32,388 27,999
Medium complex object          
encode 10,382 11,427 32,995 3,959 5,275
decode 9,785 9,796 11,515 5,898 7,200
Array with 256 True values          
encode 114,341 101,039 344,256 62,382 72,872
decode 149,367 151,615 181,123 114,597 130,392
Array with 256 dict{string, int} pairs          
encode 13,715 14,420 51,942 3,271 6,584
decode 12,670 11,788 12,176 6,743 8,278
Dict with 256 arrays with 256 dict{string, int} pairs          
encode 50 54 216 10 23
decode 32 32 30 20 23
Dict with 256 arrays with 256 dict{string, int} pairs, outputting sorted keys          
encode 46 41   8 24
Complex object          
encode 533 582   408 431
decode 466 454   154 164
</html>