zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    5 年,只为了一个更好的校验框架
    springboot 中 inputStream 神秘消失之谜
    没啥用的黑科技——自动生成测试对象信息框架
    投资中最简单的事
    一个提升英文单词拼写检测性能 1000 倍的算法?
    基于 junit5 实现 junitperf 源码分析
    关于 junit4 90% 的人都不知道的特性,详解 junitperf 的实现原理
    性能测试到底该怎么做?
    从代码生成说起,带你深入理解 mybatis generator 源码
    java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊!
  • 原文地址:https://www.cnblogs.com/skiler/p/6831769.html
Copyright © 2011-2022 走看看