#!/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)

python之json扩展的更多相关文章

  1. Json概述以及python对json的相关操作

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Langu ...

  2. 使用Python解析JSON数据的基本方法

    这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下:     ----------------------------------- ...

  3. python 序列化 json pickle

    python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...

  4. Python处理json格式的数据文件(一些坑、一些疑惑)

    这里主要说最近遇到的一个问题,不过目前只是换了一种思路先解决了,脑子里仍然有疑惑,只能怪自己太菜. 最近要把以前爬的数据用一下了,先简单的过滤一下,以前用scrapy存数据的时候为了省事也为了用一下它 ...

  5. Python和C扩展实现方法

    一.Python和C扩展 cPython是C编写的,python的扩展可以用C来写,也便于移植到C++. 编写的Python扩展,需要编译成一个.so的共享库. Python程序中. 官方文档:htt ...

  6. Python处理JSON

    从开源中国的博客搬来,合并博客 一.JSON是什么? JSON是一种轻量级的数据交换格式 二.Python处理JSON的思维 其实很容易理解,无非是将数据编成JSON格式数据和吧JSON格式的数据解析 ...

  7. Python处理JSON数据

    python解析json时为了方便,我们首先安装json模块,这里选择demjson,官方网址是:http://deron.meranda.us/python/demjson/ 访问之后点击页面的的D ...

  8. Json概述以及python对json的相关操作(转)

    什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...

  9. python 格式化 json输出

    利用python格式化json 字符串输出. $ echo '{"json":"obj"}' | python -m json.tool 利用python -m ...

随机推荐

  1. HTML 参考手册- (HTML5 标准)

    HTML 参考手册- (HTML5 标准) 功能排序 New : HTML5 新标签 标签 描述 基础   <!DOCTYPE>  定义文档类型. <html> 定义一个 HT ...

  2. spring mvc:输出json,输出多个json

    spring mvc:输出xml/输出json 用到的注解@ResponseBody @ResponseBody用来输出json/xml等格式数据(非html) controller输出用到的类 or ...

  3. Docker 进入容器的几种方式

    进入Docker容器比较常见的几种做法如下: 使用docker attach 使用SSH 使用nsenter 使用exec 一.使用docker attach进入Docker容器 Docker提供了a ...

  4. ASP.NET Core and .NET Core Library Support

    ASP.NET Core and .NET Core Library Support 详情参见:https://github.com/linezero/NETCoreLibrary/blob/mast ...

  5. hdu4318阶梯博弈nim变形

    阶梯博弈原理参考:http://www.cnblogs.com/jiangjing/p/3849284.html 这题计算每两个之间的间隔就行了,如果是奇数个就把第一个前面的看作一个,偶数个就是两个点 ...

  6. Oracle 反应太后知后觉了.

    很久已经提过一个SR,关于BES一个用户可以用两个密码登陆EBS系统的问题,但是SR解决太慢,而且一致强调你们的版本太低,需要升级到最新的版本,考虑客户化的问题,我们的版本没有升级(R2.1.1),无 ...

  7. Ansible 小手册系列 四(详解配置文件)

    [root@host-172-20-6-120 ansible]# ansible --version ansible 2.2.0.0 config file = /etc/ansible/ansib ...

  8. Find the odd int

    Given an array, find the int that appears an odd number of times. There will always be only one inte ...

  9. 【hive】null值判断

    hive用作null值的判断是不能用 = , != 来判断的 只能用is [not] null来完成 不支持ifnull()函数(mysql支持) 适用于所有数据类型 (1)条件中判断是否为空 whe ...

  10. navicat for mysql 导入SQL Server显示中文乱码解决办法

    解决方法是在navicat里右击一个连接,选择连接属性,切换到高级选项卡,去掉“使用mysql字符集”前的对勾,在编码里选择utf-8