用于python的超高速json编码器和解码器(internet archive fork)
ujson-ia的Python项目详细描述
关于这个叉子
我们在互联网档案馆使用这个版本。我们已经合并了@vdmit11从https://github.com/dignio/ultrajson到上游master的最新更改,并可能继续进行其他调整。
要安装:
$ pip install ujson-ia
回到您定期安排的自述文件
ultra json是一个超高速的json编码器和解码器,用纯c编写,绑定python 2.5+和3。
对于一个更加无痛的日常C/C++ JSON解码器经验,请基于UpjJSON检查{A3}。
使用量
可以作为python的大多数其他json解析器的替换:
>>>importujson>>>ujson.dumps([{"key":"value"},81,True])'[{"key":"value"},81,true]'>>>ujson.loads("""[{"key": "value"}, 81, true]""")[{u'key':u'value'},81,True]
编码器选项
编码HTML字符
用于将“不安全”HTML字符特殊编码为更安全的Unicode序列。默认值是False:
>>>ujson.dumps("<script>John&Doe",encode_html_chars=True)'"\\u003cscript\\u003eJohn\\u0026Doe"'
确保使用ascii
将输出限制为ascii并转义127以上的所有扩展字符。默认值为true。如果您的终端格式支持utf-8,强烈建议将此选项设置为false以节省空间:
>>>ujson.dumps(u"\xe5\xe4\xf6")'"\\u00e5\\u00e4\\u00f6"'>>>ujson.dumps(u"\xe5\xe4\xf6",ensure_ascii=False)'"\xc3\xa5\xc3\xa4\xc3\xb6"'
向前逃逸切口
控制是否转义正斜杠(/)。默认值是True:
>>>ujson.dumps("http://esn.me")'"http:\/\/esn.me"'>>>ujson.dumps("http://esn.me",escape_forward_slashes=False)'"http://esn.me"'
缩进
控制是否启用缩进(“漂亮的输出”)。默认值是0(禁用):
>>>ujson.dumps({"foo":"bar"})'{"foo":"bar"}'>>>ujson.dumps({"foo":"bar"},indent=4){"foo":"bar"}
预编码挂钩
允许为每个已编码的python对象提供一个调用的自定义函数。
钩子函数的语义类似于标准的jsonencoder.default()方法, 但是,在任何其他序列化尝试之前调用pre_encode_hook(),而 当所有其他选项都不起作用时调用default()。
允许重写已存在的行为并定义自定义序列化的 日期之类的格式。例如:
# Default behavior: datetime is converted to timestamp >>> ujson.dumps({"a": "foo", "b": datetime.now()}) '{"a":"foo","b":1454523657}' # Hook is involved: the datetime object is replaced with the .isoformat() string >>> def hook(obj): return obj.isoformat() if hasattr(obj, 'isoformat') else obj >>> ujson.dumps({"a": "foo", "b": datetime.now()}, pre_encode_hook=hook) '{"a":"foo","b":"2016-02-03T18:21:55.351081"}'
钩子可用于在 编码它。但是,它不会取消所有进一步的编码转换。 例如,如果从钩子返回datetime对象而不是字符串, 它将被转换为时间戳。
预编码原语
指示还应调用pre_encode_hook()的布尔标志 对于序列化为原始json类型的python对象(数字、字符串, 布尔值,空)。
通常不需要为这些文件定义任何特殊的序列化格式 类型,因此默认情况下标志为false。
启用此标志可能会产生大量的pre_encode_hook()调用(即 钩子将为每个json值调用),从而影响性能。
解码器选项
精确浮动
设置为在将字符串解码为双倍值时启用更高精度(strTod)函数。默认设置是使用快速但不太精确的内置功能:
>>> ujson.loads("4.56")
4.5600000000000005
>>> ujson.loads("4.56", precise_float=True)
4.5599999999999996
对象挂钩
在json对象解码后调用的自定义python函数。
钩子语义类似于标准的jsondecoder.object_hook()行为。
您可以使用它将字典(解码的json对象)转换为more
特定对象。
例如:
>>> def hook(obj):
if '__complex__' in obj:
return complex(obj['real'], obj['imag'])
return obj
>>> ujson.loads('{"__complex__": true, "real": 1, "imag": 2}', object_hook=hook)
(1+2j)
弦钩
类似于object_hook,但对每个解码字符串都调用。
用于从文本表示中反序列化对象(如日期),例如:
>>> def hook(s):
if s.startswith('__DATE'):
return datetime.strptime(s, '__DATE: %Y-%m-%d')
return s
>>> ujson.loads('{"a": "foo", "b": "__DATE: 2016-01-01"}', string_hook=hook)
{'a': 'foo', 'b': datetime.datetime(2016, 1, 1, 0, 0)}
精确浮动
设置为在将字符串解码为双倍值时启用更高精度(strTod)函数。默认设置是使用快速但不太精确的内置功能:
>>> ujson.loads("4.56") 4.5600000000000005 >>> ujson.loads("4.56", precise_float=True) 4.5599999999999996
对象挂钩
在json对象解码后调用的自定义python函数。
钩子语义类似于标准的jsondecoder.object_hook()行为。 您可以使用它将字典(解码的json对象)转换为more 特定对象。
例如:
>>> def hook(obj): if '__complex__' in obj: return complex(obj['real'], obj['imag']) return obj >>> ujson.loads('{"__complex__": true, "real": 1, "imag": 2}', object_hook=hook) (1+2j)
弦钩
类似于object_hook,但对每个解码字符串都调用。
用于从文本表示中反序列化对象(如日期),例如:
>>> def hook(s): if s.startswith('__DATE'): return datetime.strptime(s, '__DATE: %Y-%m-%d') return s >>> ujson.loads('{"a": "foo", "b": "__DATE: 2016-01-01"}', string_hook=hook) {'a': 'foo', 'b': datetime.datetime(2016, 1, 1, 0, 0)}
基准
ultrajson调用/秒,与其他三个流行的json解析器相比,每种解析器的性能都有所提高。
试验机:
Linux 3.13.0-66-generic x86_64 108 ubuntu smp 10月7日星期三15:20:2015年协调世界时27日
版本:
- CPython 2.7.6(默认值,2015年6月22日,17:58:13)[GCC 4.8.2]
- blist:1.3.6
- SimpleJSON:3.8.1
- ujson:1.34(0c52200eb4e2d97e548a765d5f089858c41967b0)
- yajl:0.3.5
版本:
- CPython 3.4.3(默认值,2015年10月14日,20:28:29)[GCC 4.8.4]
- blist:1.3.6
- SimpleJSON:3.8.1
- ujson:1.34(0c52200eb4e2d97e548a765d5f089858c41967b0)
- yajl:0.3.5