分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

json,json扩展

发布时间:2023-09-06 02:21责任编辑:白小东关键词:jsjson
#参数1:obj(基本数据类型) 参数2:fp=open(file)
def dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, ???????allow_nan=True, cls=None, indent=None, separators=None, ???????default=None, sort_keys=False, **kw): ???"""Serialize ``obj`` as a JSON formatted stream to ``fp`` (a ???``.write()``-supporting file-like object). ????#具备f.write()的功能 ???If ``skipkeys`` is true then ``dict`` keys that are not basic types ???(``str``, ``int``, ``float``, ``bool``, ``None``) will be skipped ???instead of raising a ``TypeError``. ???If ``ensure_ascii`` is false, then the strings written to ``fp`` can ???contain non-ASCII characters if they appear in strings contained in ???``obj``. Otherwise, all such characters are escaped in JSON strings. ???If ``check_circular`` is false, then the circular reference check ???for container types will be skipped and a circular reference will ???result in an ``OverflowError`` (or worse). ???If ``allow_nan`` is false, then it will be a ``ValueError`` to ???serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) ???in strict compliance of the JSON specification, instead of using the ???JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). ???If ``indent`` is a non-negative integer, then JSON array elements and ???object members will be pretty-printed with that indent level. An indent ???level of 0 will only insert newlines. ``None`` is the most compact ???representation. ???If specified, ``separators`` should be an ``(item_separator, key_separator)`` ???tuple. ?The default is ``(‘, ‘, ‘: ‘)`` if *indent* is ``None`` and ???``(‘,‘, ‘: ‘)`` otherwise. ?To get the most compact JSON representation, ???you should specify ``(‘,‘, ‘:‘)`` to eliminate whitespace. ???``default(obj)`` is a function that should return a serializable version ???of obj or raise TypeError. The default simply raises TypeError. ???If *sort_keys* is true (default: ``False``), then the output of ???dictionaries will be sorted by key. ???To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the ???``.default()`` method to serialize additional types), specify it with ???the ``cls`` kwarg; otherwise ``JSONEncoder`` is used. ???""" ???# cached encoder ???if (not skipkeys and ensure_ascii and ???????check_circular and allow_nan and ???????cls is None and indent is None and separators is None and ???????default is None and not sort_keys and not kw): ???????iterable = _default_encoder.iterencode(obj) ???else: ???????if cls is None: ???????????cls = JSONEncoder ???????iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii, ???????????check_circular=check_circular, allow_nan=allow_nan, indent=indent, ???????????separators=separators, ???????????default=default, sort_keys=sort_keys, **kw).iterencode(obj) ???# could accelerate with writelines in some versions of Python, at ???# a debuggability cost ???for chunk in iterable: ???????fp.write(chunk)
class JSONEncoder(object):
#默认json只能序列化基本数据类型 ???"""Extensible JSON <http://json.org> encoder for Python data structures. ???Supports the following objects and types by default: ???+-------------------+---------------+ ???| Python ???????????| JSON ?????????| ???+===================+===============+ ???| dict ?????????????| object ???????| ???+-------------------+---------------+ ???| list, tuple ??????| array ????????| ???+-------------------+---------------+ ???| str ??????????????| string ???????| ???+-------------------+---------------+ ???| int, float ???????| number ???????| ???+-------------------+---------------+ ???| True ?????????????| true ?????????| ???+-------------------+---------------+ ???| False ????????????| false ????????| ???+-------------------+---------------+ ???| None ?????????????| null ?????????| ???+-------------------+---------------+ ???To extend this to recognize other objects, subclass and implement a ???``.default()`` method with another method that returns a serializable ???object for ``o`` if possible, otherwise it should call the superclass ???implementation (to raise ``TypeError``). ???"""

def default(self, o): ??????????????????#默认会报错
???"""Implement this method in a subclass such that it returns
???a serializable object for ``o``, or calls the base implementation
???(to raise a ``TypeError``).

???For example, to support arbitrary iterators, you could
???implement default like this::

???????def default(self, o):
???????????try:
???????????????iterable = iter(o)
???????????except TypeError:
???????????????pass
???????????else:
???????????????return list(iterable)
???????????# Let the base class default method raise the TypeError
???????????return JSONEncoder.default(self, o)

???"""
???raise TypeError("Object of type ‘%s‘ is not JSON serializable" %
???????????????????o.__class__.__name__)
 

扩展json可以序列化的类型:

扩展的实质就是扩展JSONEncoder 的 default 方法

import json as default_json ????????????from json.encoder import JSONEncoderfrom .response import BaseResponseclass JsonEncoder(JSONEncoder): ??#继承JSONEncoder ???def default(self, o): ?????????????????#写default 方法 ???????if isinstance(o,BaseResponse): ???????????return o.__dict__ ???????return JSONEncoder.default(self,o)class Json(object): ????????????#自定义的Json ???@staticmethod ???def dumps(response,ensure_ascii=True): ??????#自定义的dumps ???????return default_json.dumps(response,ensure_ascii=ensure_ascii,cls=JsonEncoder) ???
#自定义的dumps返回系统(json)的dumps方法,但是cls是扩展的JsonEncoder

To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
``.default()`` method to serialize additional types), specify it with
the ``cls`` kwarg; otherwise ``JSONEncoder`` is used.

"""

json,json扩展

原文地址:https://www.cnblogs.com/wuxi9864/p/9908452.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved