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遍历指定文件及文件夹的方法
May 09 Python
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
浅谈python多线程和队列管理shell程序
Aug 04 Python
深入理解python中函数传递参数是值传递还是引用传递
Nov 07 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
Apr 17 Python
python3利用ctypes传入一个字符串类型的列表方法
Feb 12 Python
Django中如何使用sass的方法步骤
Jul 09 Python
Python 经典算法100及解析(小结)
Sep 13 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
pyqt5中动画的使用详解
Apr 01 Python
Python实现给PDF添加水印的方法
Jan 25 Python
Python数据可视化之Seaborn的安装及使用
Apr 19 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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
5.PHP的其他功能
2006/10/09 PHP
《PHP边学边教》(01.开篇――准备工作)
2006/12/13 PHP
php addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
jQuery 性能优化指南(2)
2009/05/21 Javascript
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
2012/08/14 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
2013/04/07 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
2013/09/03 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
js不间断滚动的简单实现
2016/06/03 Javascript
Angular路由简单学习
2016/12/26 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
python学习教程之使用py2exe打包
2017/09/24 Python
对Python 数组的切片操作详解
2018/07/02 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
Python基于mysql实现学生管理系统
2019/02/21 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
Nanushka官网:匈牙利服装品牌
2019/08/14 全球购物
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
应届大学生自荐信
2013/12/05 职场文书
营业用房租赁协议书
2014/11/26 职场文书
2014年单位工作总结范文
2014/11/27 职场文书
Python基础之hashlib模块详解
2021/05/06 Python
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL
详解nginx location指令
2022/01/18 Servers
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle
Innodb存储引擎中的后台线程详解
2022/04/03 MySQL
零基础学java之循环语句的使用
2022/04/10 Java/Android