UltraJSON 是一种超快速 JSON 编码器和解码器,用纯 C 语言编写,并绑定了 Python 3.9+。
使用 pip 安装:
python -m pip install ujson
警告
UltraJSON 的架构从根本上来说不适合在没有引入新安全漏洞的风险的情况下进行更改。因此,该库已进入仅维护模式。将添加对新 Python 版本的支持,并且仍将修复关键错误和安全问题,但所有其他更改将被拒绝。我们鼓励用户迁移到 orjson,这样速度更快,而且将来不太可能引入意外的缓冲区溢出漏洞。
可用作大多数其他 Python JSON 解析器的替代品:
>>> import ujson
>>> ujson.dumps([{ " key " : " value " }, 81 , True ])
'[{"key":"value"},81,true]'
>>> ujson.loads( """ [{"key": "value"}, 81, true] """ )
[{'key': 'value'}, 81, True]
用于将“不安全”HTML 字符特殊编码为更安全的 Unicode 序列。默认为False
:
>>> ujson.dumps( " <script>John&Doe " , encode_html_chars = True )
'"\u003cscript\u003eJohn\u0026Doe"'
将输出限制为 ASCII 并对 127 以上的所有扩展字符进行转义。默认值为True
。如果您的最终格式支持 UTF-8,强烈建议将此选项设置为 false 以节省空间:
>>> ujson.dumps( " åäö " )
'"\u00e5\u00e4\u00f6"'
>>> ujson.dumps( " åäö " , ensure_ascii = False )
'"åäö"'
控制是否转义正斜杠 ( /
)。默认为True
:
>>> ujson.dumps( " https://example.com " )
'"https:\/\/example.com"'
>>> ujson.dumps( " https://example.com " , escape_forward_slashes = False )
'"https://example.com"'
控制是否启用缩进(“漂亮的输出”)。默认值为0
(禁用):
>>> ujson.dumps({ " foo " : " bar " })
'{"foo":"bar"}'
>>> print (ujson.dumps({ " foo " : " bar " }, indent = 4 ))
{
"foo":"bar"
}
与其他流行的 JSON 解析器相比, UltraJSON调用/秒的性能增益如下所示。
Linux 5.15.0-1037-azure x86_64 #44-Ubuntu SMP 2023 年 4 月 20 日星期四 13:19:31 UTC 2023
乌杰森 | 或json | 简单的json | json | |
---|---|---|---|---|
包含 256 个双精度数的数组 | ||||
编码 | 18,282 | 79,569 | 5,681 | 5,935 |
解码 | 28,765 | 93,283 | 13,844 | 13,367 |
包含 256 个 UTF-8 字符串的数组 | ||||
编码 | 3,457 | 26,437 | 3,630 | 3,653 |
解码 | 3,576 | 4,236 | 第522章 | 1,978 |
包含 256 个字符串的数组 | ||||
编码 | 44,769 | 125,920 | 21,401 | 23,565 |
解码 | 28,518 | 75,043 | 41,496 | 42,221 |
中等复杂对象 | ||||
编码 | 11,672 | 47,659 | 3,913 | 5,729 |
解码 | 12,522 | 23,599 | 8,007 | 9,720 |
具有 256 个 True 值的数组 | ||||
编码 | 110,444 | 425,919 | 81,428 | 84,347 |
解码 | 203,430 | 318,193 | 146,867 | 156,249 |
包含 256 个 dict{string, int} 对的数组 | ||||
编码 | 14,170 | 72,514 | 3,050 人 | 7,079 |
解码 | 19,116 | 27,542 | 9,374 | 13,713 |
包含 256 个数组和 256 个 dict{string, int} 对的字典 | ||||
编码 | 55 | 第282章 | 11 | 26 |
解码 | 48 | 53 | 27 号 | 34 |
具有 256 个数组的字典,包含 256 个 dict{string, int} 对,输出排序后的键 | ||||
编码 | 42 | 8 | 27 号 | |
复杂对象 | ||||
编码 | 第462章 | 第397章 | 第444章 | |
解码 | 第480章 | 618 | 177 | 310 |
以上指标以调用/秒为单位,越大越好。
对于那些有特殊需求的人,例如 Linux 发行版打包程序,以环境变量的形式提供了几个构建选项。
默认情况下,调试符号在 Linux 平台上被去除。将此环境变量设置为值1
或True
将禁用此行为。
这两个环境变量通常一起使用,例如:
export UJSON_BUILD_DC_INCLUDES= ' /usr/include/double-conversion '
export UJSON_BUILD_DC_LIBS= ' -ldouble-conversion '
计划链接到外部共享库的用户应该注意在升级系统库或将编译的轮子复制到其他机器时引入的 ABI 兼容性要求。
一个或多个目录,由os.pathsep
(与PATH
环境变量相同)分隔,在其中查找double-conversion
头文件;默认是使用捆绑副本。
链接double-conversion
库所需的编译器标志;默认是使用捆绑副本。