Python Json序列化与反序列化的示例


Posted in Python onJanuary 31, 2018

不同的编程语言有不同的数据类型; 比如说:

Python的数据类型有(dict、list、string、int、float、long、bool、None)
Java的数据类型有(bool、char、byte、short、int、long、float、double)
C的数据类型有(bit、bool、char、int、short、long、unsigned、double、float)
Tcl的数据类型(int、bool、float、string)
Ruby的数据类型(Number、String、Ranges、Symbols、true、false、Array、Hash)
...

他们的共同特点是,都有字符串类型!

所以要实现不同的编程语言之间对象的传递,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。
JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便.

JSON类型     Python类型
{}                  dict
[]                  list
"string"            str
1234.56             int或float
true                True
false               False
null                None

在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式字符串解码为python数据对象。在python的标准库中,专门提供了json库与pickle库来处理这部分。

json的dumps方法和loads方法,可实现数据的序列化和反序列化。具体来说,dumps方法,可将json格式数据序列为Python的相关的数据类型;loads方法则是相反,把python数据类型转换为json相应的数据类型格式要求。在序列化时,中文汉字总是被转换为unicode码,在dumps函数中添加参数ensure_ascii=False即可解决。

下面是json的序列化与反序列化:

1、Json序列化如下:

import json
print (json.__all__)  #查看json库的所有方法
['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']

未在dumps函数中添加参数ensure_ascii=False,结果如下:

#coding: utf-8
import json
dict = {'name':'zhangsan', 'age':33, 'address':'红星路'}
print('未序列化前的数据类型为:', type(dict))
print('为序列化前的数据:', dict)
#对dict进行序列化的处理
dict_xu = json.dumps(dict)  #直接进行序列化
print('序列化后的数据类型为:', type(dict_xu))
print('序列化后的数据为:', dict_xu)

未序列化前的数据类型为: <class 'dict'>
为序列化前的数据: {'name': 'zhangsan', 'address': '红星路', 'age': 33}
序列化后的数据类型为: <class 'str'>
序列化后的数据为: {"name": "zhangsan", "address": "\u7ea2\u661f\u8def", "age": 33}

在dumps函数中添加参数ensure_ascii=False,结果如下:

#coding: utf-8
import json

dict = {'name':'zhangsan', 'age':33, 'address':'红星路'}
print('未序列化前的数据类型为:', type(dict))
print('为序列化前的数据:', dict)
#对dict进行序列化的处理
dict_xu = json.dumps(dict,ensure_ascii=False)  #添加ensure_ascii=False进行序列化
print('序列化后的数据类型为:', type(dict_xu))
print('序列化后的数据为:', dict_xu)

未序列化前的数据类型为: <class 'dict'>
为序列化前的数据: {'address': '红星路', 'age': 33, 'name': 'zhangsan'}
序列化后的数据类型为: <class 'str'>
序列化后的数据为: {"address": "红星路", "age": 33, "name": "zhangsan"}

2、Json反序列化如下:

#coding: utf-8
import json
dict = {'name':'zhangsan', 'age':33, 'address':'红星路'}
print('未序列化前的数据类型为:', type(dict))
print('为序列化前的数据:', dict)
#对dict进行序列化的处理
dict_xu = json.dumps(dict,ensure_ascii=False)  #添加ensure_ascii=False进行序列化
print('序列化后的数据类型为:', type(dict_xu))
print('序列化后的数据为:', dict_xu)
#对dict_xu进行反序列化处理
dict_fan = json.loads(dict_xu)
print('反序列化后的数据类型为:', type(dict_fan))
print('反序列化后的数据为: ', dict_fan)

未序列化前的数据类型为: <class 'dict'>
为序列化前的数据: {'name': 'zhangsan', 'age': 33, 'address': '红星路'}
序列化后的数据类型为: <class 'str'>
序列化后的数据为: {"name": "zhangsan", "age": 33, "address": "红星路"}
反序列化后的数据类型为: <class 'dict'>
反序列化后的数据为:  {'name': 'zhangsan', 'age': 33, 'address': '红星路'}

在实际的工作中,序列化或者反序列化的可能是一个文件的形式,不可能像如上写的那样简单的,下来就来实现这部分,把文件内容进行序列化和反序列化,先来看序列化的代码,两步操作:1、先序列化 列表对象 ;2、步把序列化成的字符串写入文件:

#coding: utf-8
import json

list = ['Apple','Huawei','selenium','java','python']
#把list先序列化,写入到一个文件中
# 两步操作 1步先序列化 列表对象 2步把序列化成的字符串写入文件
json.dump(list, open('e:/test.txt','w'))  
r1=open('e:/test.txt','r')
print(r1.read())

["Apple", "Huawei", "selenium", "java", "python"]

反序列化,两步操作:1、先读取文件的字符串对象;2、然后反序列化成列表对象:

#coding: utf-8
import json

list = ['Apple','Huawei','selenium','java','python']
#把list先序列化,写入到一个文件中
# 两步操作 1步先序列化 列表对象 2步把序列化成的字符串写入文件
json.dump(list, open('e:/test.txt','w'))  
r1=open('e:/test.txt','r')
print(r1.read())
#------------------------------------------------------------
#两步操作:1、先读取文件的字符串对象;2、然后反序列化成列表对象
res=json.load(open('e:/test.txt','r'))
print (res)
print('数据类型:',type(res))

["Apple", "Huawei", "selenium", "java", "python"]
['Apple', 'Huawei', 'selenium', 'java', 'python']
数据类型: <class 'list'>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python的Flask框架中实现单元测试的教程
Apr 20 Python
Python网站验证码识别
Jan 25 Python
python中字符串比较使用is、==和cmp()总结
Mar 18 Python
python 矩阵增加一行或一列的实例
Apr 04 Python
详解Django之admin组件的使用和源码剖析
May 04 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
Python中利用aiohttp制作异步爬虫及简单应用
Nov 29 Python
django主动抛出403异常的方法详解
Jan 04 Python
树莓派使用USB摄像头和motion实现监控
Jun 22 Python
python归并排序算法过程实例讲解
Nov 04 Python
Numpy中np.max的用法及np.maximum区别
Nov 27 Python
pytest配置文件pytest.ini的详细使用
Apr 17 Python
Python实现JSON反序列化类对象的示例
Jan 31 #Python
python删除过期log文件操作实例解析
Jan 31 #Python
Python实现的井字棋(Tic Tac Toe)游戏示例
Jan 31 #Python
使用Python制作微信跳一跳辅助
Jan 31 #Python
python模块之paramiko实例代码
Jan 31 #Python
Python进度条实时显示处理进度的示例代码
Jan 30 #Python
Python3生成手写体数字方法
Jan 30 #Python
You might like
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
php处理复杂xml数据示例
2016/07/11 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
禁止F5等快捷键的JS代码
2007/03/06 Javascript
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
jQuery的bind()方法使用详解
2015/07/15 Javascript
javascript中new关键字详解
2015/12/14 Javascript
深入理解JavaScript程序中内存泄漏
2016/03/17 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
一个可复用的vue分页组件
2017/05/15 Javascript
nodejs对express中next函数的一些理解
2017/09/08 NodeJs
mui框架移动开发初体验详解
2017/10/11 Javascript
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
python获取各操作系统硬件信息的方法
2015/06/03 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
python求解数组中两个字符串的最小距离
2018/09/27 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
python多环境切换及pyenv使用过程详解
2019/09/27 Python
Python3操作读写CSV文件使用包过程解析
2020/04/10 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
精伦电子Java笔试题
2013/01/16 面试题
一份软件工程师的面试试题
2016/02/01 面试题
小学新学期教师寄语
2014/01/18 职场文书
优秀学生事迹材料
2014/02/08 职场文书
委托证明模板
2014/09/16 职场文书
领导四风问题整改措施思想汇报
2014/10/13 职场文书
公务员个人年终总结
2015/02/12 职场文书
各种货币符号快捷输入
2022/02/17 杂记
未发现nvidia显卡怎么办?Win11系统中未检测到nvidia显卡解决教程
2022/04/08 数码科技