用Python3处理JSON
2015-10-02 13:46
573 查看
本文转载自/article/3500880.html(略作修改)
在python中提供了标准库json将基本类型的数据转化成json格式,但是在涉及到自定义类型时需要扩展或者复写Encoder(Decoder)来实现,默认情况下json会抛出”TypeErro: xxx is not json serializable”的错误。本文参考了文章Json概述以及python对json的相关操作。
在json反序列化过程中基本类型和Python3基本类型的对应关系:
序列化函数dumps的几个常用参数:
separators: 指定生成的json字符串所用的分隔符,两个分别用于代替“,”、“:”。
indent: 用于格式化生成的json字符串,接受整数参数的缩进量。
sort_keys: True/False,指定dict在序列化时是否按照key排序。
例如:
json.JSONEncoder的主要方法:
default:目的和dumps的default参数一样。
encode:实现序列化的逻辑部分。
在python中提供了标准库json将基本类型的数据转化成json格式,但是在涉及到自定义类型时需要扩展或者复写Encoder(Decoder)来实现,默认情况下json会抛出”TypeErro: xxx is not json serializable”的错误。本文参考了文章Json概述以及python对json的相关操作。
在json反序列化过程中基本类型和Python3基本类型的对应关系:
JSON | Python |
---|---|
Object | dict |
Array | list |
String | str |
number(int) | int |
number(real) | float |
true | True |
false | False |
null | None |
基本类型的序列化/反序列化
对于基本类型的数据直接使用json.dumps和json.loads方法进行序列化和反序列化。import json array = ['d', 'b', 'c', 'a', {'b':100, 'a':'letter a'}] encodestr = json.dumps(array) org_obj = json.loads(encodestr)
序列化函数dumps的几个常用参数:
separators: 指定生成的json字符串所用的分隔符,两个分别用于代替“,”、“:”。
indent: 用于格式化生成的json字符串,接受整数参数的缩进量。
sort_keys: True/False,指定dict在序列化时是否按照key排序。
例如:
json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4, separators=(',', ': '))
自定义类型的序列化——使用函数
json.dumps函数接受参数default用于指定一个函数,该函数能够把自定义类型的对象转换成可序列化的基本类型。
json.loads函数接受参数object_hook用于指定函数,该函数负责吧反序列化后的基本类型对象转换成自定义类型的对象。
boy1 = boy('Will', 20) #default method for decode def boydefault(obj): if isinstance(obj, boy): return {'name': obj.name, 'age': obj.age} return obj; def boyhook(dic): print('test') if dic['name']: return boy(dic['name'], dic['age']) return dic boy_encode_str = json.dumps(boy1, default=boydefault) new_boy = json.loads(boy_encode_str, object_hook=boyhook) print(boy_encode_str) print(new_boy)
自定义类型的序列化——使用类
除此以外json库提供了JSONEncoder和JSONDecoder两个类用于json的序列化和反序列化,可以通过子类实现自定义类的json操作(估计json库内部逻辑也是用的这两个类)。json.JSONEncoder的主要方法:
default:目的和dumps的default参数一样。
encode:实现序列化的逻辑部分。
json.JSONEncoder的方法就是default。这里有两个思路一个是重载
json.JSONDecoder的构造函数设置object_hook,另一个是重载decode方法添加由dict转换为自定义类的逻辑。
class BoyEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, boy): return {'name': o.name, 'age': o.age} return json.JSONEncoder.default(o); #override decode method class BoyDecoder(json.JSONDecoder): def decode(self, s): dic = super().decode(s); return boy(dic['name'], dic['age']); #override __init__ method class BoyDecoder2(json.JSONDecoder): def __init__(self): json.JSONDecoder.__init__(self) self.object_hook = boyhook boy_encode_str = json.dumps(boy1, cls=BoyEncoder) new_boy = json.loads(boy_encode_str, cls=BoyDecoder) new_boy2 = json.loads(boy_encode_str, cls=BoyDecoder2) print(boy_encode_str) print(new_boy) print(new_boy2)
相关文章推荐
- windows系统部署python Deep Learning平台
- Python中subprocess学习
- python概述以及安装环境和第一个程序以及一些语言基本语法
- python chinese code
- python regrex
- python BeautifulSoup4
- [python爬虫] Selenium定向爬取海量精美图片及搜索引擎杂谈
- 关于python中文乱码很好的一篇文章
- 【Python之旅】第四篇(三):Python面向对象编程详解
- 【Python之旅】第四篇(三):Python面向对象编程详解
- python步进切片
- python自然预言处理_(一)python与NLP
- python基础6之命名空间与作用域
- python读取和显示txt文件
- 分享一下Python 开发者节省时间的10个方法
- 零基础学python-19.7 扩展生成器函数
- 零基础学python-19.7 扩展生成器函数
- python基础5之错误处理
- 【Python之旅】第四篇(二):Python异常处理与异常捕捉
- 【Python之旅】第四篇(二):Python异常处理与异常捕捉