加入python stdlib时间
json: 2.6
simplejson: 2.4+
simplejson比json更新快, simplejson支持的python版本范围更广。
simplejson和json的性能:
对于转储dumps(),json比simplejson更快。对于加载loads(),simplejson更快。
目前正在构建Web服务,dumps()用的更多,因此更为重要 - 故始终首选使用json标准库,其次simplejson;此外,cjson在过去4年没有更新,所以我不会碰它。
当然具体选择是根据需求而定的,例如构建Web服务有用到 ignore_nan=True 这个参数,json标准库中是没有的,故需导入import simplejson as json。
例如构建Web服务有用到 cls=DateIntEncoder,这里需要使用json标准库,使用import simplejson as json会报错:TypeError: __init__() got an unexpected keyword argument 'encoding'。
原因是simplejson中 json.dumps中默认传入参数encoding='utf-8'。
return json.dumps(res, ensure_ascii=False, cls=DateIntEncoder, indent=4)
其中cls=DateIntEncoder是解决json dumps不能序列化datatime数据类型的问题,通过重写JSONEncoder。
class DateIntEncoder(json.JSONEncoder):
"""
datetime格式的数据转换,int64解决
"""
def default(self, obj):
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, datetime.date):
return obj.strftime("%Y-%m-%d")
else:
return json.JSONEncoder.default(self, obj)
json与simplejson参数详解:
import json
……
return json.dumps(res, ensure_ascii=False, indent=4)
def dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
default=None, sort_keys=False, **kw):
将obj”序列化为JSON格式的“ str”。
如果``skipkeys''为true,则不是基本类型的``dict''键
(``str``,``int'',``float'',``bool'',``None'')将被跳过
而不是引发TypeError。
如果``ensure_ascii''为false,则返回值可以包含非ASCII
字符(如果它们出现在obj中包含的字符串中)。否则,全部
这样的字符在JSON字符串中转义。
如果check_circular为假,则循环引用检查
容器类型将被跳过,并且循环引用将
导致``OverflowError``(或更糟)。
如果allow_nan为假,则将为ValueError
序列化超出范围的``float''值(``nan'',``inf'',``-inf'')
严格遵守JSON规范,而不是使用
JavaScript等效项(``NaN``,``Infinity'',``-Infinity'')。
如果``indent''是非负整数,则JSON数组元素和
对象成员将以该缩进级别进行漂亮打印。缩进
级别0只会插入换行符。 ``无''是最紧凑的
表示。
如果指定,则``separators''应为``(item_separator,key_separator)''
元组。如果* indent *为None且默认值为``(',',':')``
``(',',':')``否则。为了获得最紧凑的JSON表示,
您应该指定``(',',':')``以消除空格。
default(obj)是一个应该返回可序列化版本的函数
obj或引发TypeError。默认值只是引发TypeError。
如果* sort_keys *为true(默认值:``False''),则输出
字典将按键排序。
要使用自定义的JSONEncoder子类(例如,覆盖子类的
``.default()``方法来序列化其他类型),使用
``cls''kwarg;否则使用``JSONEncoder''。
import simplejson as json
……
return json.dumps(res, ensure_ascii=False, indent=4, ignore_nan=True)
def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
encoding='utf-8', default=None, use_decimal=True,
namedtuple_as_object=True, tuple_as_array=True,
bigint_as_string=False, sort_keys=False, item_sort_key=None,
for_json=False, ignore_nan=False, int_as_string_bitcount=None,
iterable_as_array=False, **kw):
将obj”序列化为JSON格式的“ str”。
如果``skipkeys''为假,则不是基本类型的``dict''键
(``str'',``int'',``long'',``float'',``bool'',``None'')
将被跳过,而不是引发“ TypeError”。
如果* ensure_ascii *为false(默认值:``True''),则输出可能
包含非ASCII字符,只要它们不需要转义
通过JSON。为true时,将转义所有非ASCII字符。
如果check_circular为假,则循环引用检查
容器类型将被跳过,并且循环引用将
导致``OverflowError``(或更糟)。
如果allow_nan为假,则将为ValueError
序列化超出范围的``float''值(``nan'',``inf'',``-inf'')
严格遵守JSON规范,而不是使用
JavaScript等效项(``NaN``,``Infinity'',``-Infinity'')。
如果``indent``是一个字符串,则JSON数组元素和对象成员
将用换行符漂亮地打印出来,然后重复该字符串
嵌套的每个级别。 ``无''(默认)选择最紧凑的
没有换行符的表示形式。为了向后兼容
2.1.0之前的simplejson版本,也可以接受整数
并转换为具有这么多空格的字符串。
如果指定,separator应为
``(item_separator,key_separator)''元组。默认值为``(',',':')``
如果* indent *是``None''和``(',',':')``否则。充分利用
紧凑的JSON表示形式,您应指定``(',',':')``以消除
空格。
``encoding``是字节实例的字符编码,默认是
UTF-8。
default(obj)是一个应该返回可序列化版本的函数
obj或引发TypeError。默认值只是引发TypeError。
如果* use_decimal *为true(默认值:``True''),则为十进制。
将以全精度本机序列化为JSON。
如果* namedtuple_as_object *为true(默认值:``True''),
具有_asdict()方法的tuple子类将被编码
作为JSON对象。
如果* tuple_as_array *为true(默认值:``True''),
tuple(和子类)将被编码为JSON数组。
如果* iterable_as_array *为true(默认值:``False''),
上表中没有实现__iter __()的任何对象
将被编码为JSON数组。
如果* bigint_as_string *为true(不是默认值),则整数2 ** 53及更高
或低于-2 ** 53的值将被编码为字符串。这是为了避免
四舍五入发生在Javascript否则。
如果* int_as_string_bitcount *是一个正数(n),则int为size
大于或等于2 ** n或小于或等于-2 ** n将是
编码为字符串。
如果指定,* item_sort_key *是可调用的,用于对项目进行排序
每个字典。如果您想对除
按字母顺序排列。该选项优先于
* sort_keys *。
如果* sort_keys *为true(默认值:``False''),则词典的输出
将按项目排序。
如果* for_json *为true(默认值:``False''),则对象带有``for_json()``
方法将使用该方法的返回值进行JSON编码
而不是对象。
如果* ignore_nan *为true(默认值:``False''),则超出范围
:class:`float`值(``nan``,``inf``,``-inf``)将被序列化为
``null''符合ECMA-262规范。如果为真,这将
覆盖* allow_nan *。
要使用自定义的JSONEncoder子类(例如,覆盖子类的
``.default()``方法来序列化其他类型),使用
cls kwarg。注意:您应该使用* default *而不是子类
只要有可能。