当前位置: 首页 > 工具软件 > SimpleJSON > 使用案例 >

json与simplejson的区别及参数详解

彭弘伟
2023-12-01

加入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 *而不是子类
    只要有可能。

 

参考:https://www.imooc.com/wenda/detail/581552

https://www.cnblogs.com/xiaoerlang/p/8952604.html

 类似资料: