python之json扩展

#!/usr/bin/env python
# -*- coding: utf8 -*-
# __Author: "Skiler Hao"
# date: 2017/4/9 15:26
import json
from json.encoder import JSONEncoder


class SkilerEncoder(JSONEncoder):
    """
    默认的json只支持以下内容的序列化,我们可以对原装json的JsonEncoder作进一步扩展
    +-------------------+---------------+
    | 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``).
    补充一下,o是啥?o就是我们平常使用的时候json.dumps(object),放入sumps的对象简称o
    翻译以下官方的哈:
    要扩展json识别更多的对象,需要创建JSONEncoder一个子类。实现default()方法
    default方法,可以对某样扩展的对象处理,返回可以序列化的对象
    要么继承父类的default()方法(内容为Type error 当前对象不可实例化)
#     """
    def default(self, o):
        """
        来自官方文档的例子,实现对可迭代对象的序列化,我仅仅是搬运工,扩展还是交给大家吧
        For example, to support arbitrary iterators, you could
        implement default like this::

            def default(self, o):
                try:
                # 如果传递的是可以可以转化为可迭代的对象,那就转化
                    iterable = iter(o)

                except TypeError:
                # 如果转化失败,啥都不做,交给最好一行,父类处理(抛出类型异常)
                    pass
                else:
                # 否则就将其转化为list对象list对象是可以用默认json序列化的
                    return list(iterable)
                # Let the base class default method raise the TypeError
                # 调用父类的default方法
                return JSONEncoder.default(self, o)

        """

        try:
            if isinstance(o, complex):
                return str(o.real)+ '+' + str(o.imag) + 'j'
            # 例如复数是不能转化的,我们将其转化为字符串
            # 如果传递的是可以可以转化为可迭代的对象,那就转化

            # 如果对象是iterable我们可以将其转化为iter(o)转化为可迭代对象
            iterable = iter(o)

        except TypeError:
            # 如果转化失败,啥都不做,交给最好一行,父类处理(抛出类型异常)
            pass
        else:
            # 否则就将其转化为list对象list对象是可以用默认json序列化的
            return list(iterable)
        # Let the base class default method raise the TypeError
        # 调用父类的default方法
        return JSONEncoder.default(self, o)

if __name__ == '__main__':
    a = [x for x in range(1,10)]
    b= 1 + 2j

    c = json.dumps(a,cls=SkilerEncoder)
    d = json.dumps(b,cls=SkilerEncoder)
    print(b)

 

posted @ 2017-05-09 17:42  skiler  阅读(635)  评论(0编辑  收藏  举报