JSON模块

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
JSON在python中分别由list和dict组成。

一、python类型数据和JSON数据格式互相转换

pthon 中str类型到JSON中转为unicode类型,None转为null,dict对应object

二、数据encoding和decoding

1、简单类型数据编解码

所谓简单类型就是指上表中出现的python类型。

dumps:  将对象序列化

#coding:utf-8
import json# 简单编码===========================================
print json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
# ["foo", {"bar": ["baz", null, 1.0, 2]}]#字典排序
print json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
# {"a": 0, "b": 0, "c": 0}#自定义分隔符
print json.dumps([1,2,3,{'4': 5, '6': 7}], sort_keys=True, separators=(',',':'))
# [1,2,3,{"4":5,"6":7}]
print json.dumps([1,2,3,{'4': 5, '6': 7}], sort_keys=True, separators=('/','-'))
# [1/2/3/{"4"-5/"6"-7}]#增加缩进,增强可读性,但缩进空格会使数据变大
print json.dumps({'4': 5, '6': 7}, sort_keys=True,indent=2, separators=(',', ': '))
# {#   "4": 5,
#   "6": 7
# }
# 另一个比较有用的dumps参数是skipkeys,默认为False。# dumps方法存储dict对象时,key必须是str类型,如果出现了其他类型的话,那么会产生TypeError异常,如果开启该参数,设为True的话,会忽略这个key。data = {'a':1,(1,2):123}print json.dumps(data,skipkeys=True)
#{"a": 1}

dump:  将对象序列化并保存到文件

#将对象序列化并保存到文件
obj = ['foo', {'bar': ('baz', None, 1.0, 2)}]
with open(r"c:\json.txt","w+") as f:json.dump(obj,f)

loads:  将序列化字符串反序列化

import jsonobj = ['foo', {'bar': ('baz', None, 1.0, 2)}]
a= json.dumps(obj)
print json.loads(a)
# [u'foo', {u'bar': [u'baz', None, 1.0, 2]}]

 load:  将序列化字符串从文件读取并反序列化

with open(r"c:\json.txt","r") as f:print json.load(f)

三、自定义复杂数据类型编解码

例如我们碰到对象datetime,或者自定义的类对象等json默认不支持的数据类型时,我们就需要自定义编解码函数。有两种方法来实现自定义编解码。

1、方法一:自定义编解码函数

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = "TKQ"
import datetime,jsondt = datetime.datetime.now()def time2str(obj):#python to jsonif isinstance(obj, datetime.datetime):json_str = {"datetime":obj.strftime("%Y-%m-%d %X")}return json_strreturn objdef str2time(json_obj):#json to pythonif "datetime" in json_obj:date_str,time_str = json_obj["datetime"].split(' ')date = [int(x) for x in date_str.split('-')]time = [int(x) for x in time_str.split(':')]dt = datetime.datetime(date[0],date[1], date[2], time[0],time[1], time[2])return dtreturn json_obja = json.dumps(dt,default=time2str)
print a
# {"datetime": "2016-10-27 17:38:31"}
print json.loads(a,object_hook=str2time)
# 2016-10-27 17:38:31

2、方法二:继承JSONEncoder和JSONDecoder类,重写相关方法

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = "TKQ"
import datetime,jsondt = datetime.datetime.now()
dd = [dt,[1,2,3]]class MyEncoder(json.JSONEncoder):def default(self,obj):#python to jsonif isinstance(obj, datetime.datetime):json_str = {"datetime":obj.strftime("%Y-%m-%d %X")}return json_strreturn objclass MyDecoder(json.JSONDecoder):def __init__(self):json.JSONDecoder.__init__(self, object_hook=self.str2time)def str2time(self,json_obj):#json to pythonif "datetime" in json_obj:date_str,time_str = json_obj["datetime"].split(' ')date = [int(x) for x in date_str.split('-')]time = [int(x) for x in time_str.split(':')]dt = datetime.datetime(date[0],date[1], date[2], time[0],time[1], time[2])return dtreturn json_obj# a = json.dumps(dt,default=time2str)
a =MyEncoder().encode(dd)
print a
# [{"datetime": "2016-10-27 18:14:54"}, [1, 2, 3]]
print MyDecoder().decode(a)
# [datetime.datetime(2016, 10, 27, 18, 14, 54), [1, 2, 3]]

===========================================================

pickle模块

python的pickle模块实现了python的所有数据序列和反序列化。基本上功能使用和JSON模块没有太大区别,方法也同样是dumps/dump和loads/load。cPickle是pickle模块的C语言编译版本相对速度更快。

与JSON不同的是pickle不是用于多种语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法,因此它支持了python所有的数据类型。

pickle反序列化后的对象与原对象是等值的副本对象,类似与deepcopy。

dumps/dump序列化

from datetime import datetry:import cPickle as pickle    #python 2
except ImportError as e:import pickle   #python 3
src_dic = {"date":date.today(),"oth":([1,"a"],None,True,False),}
det_str = pickle.dumps(src_dic)
print det_str
# (dp1
# S'date'
# p2
# cdatetime
# date
# p3
# (S'\x07\xe0\n\x1b'
# tRp4
# sS'oth'
# p5
# ((lp6
# I1
# aS'a'
# aNI01
# I00
# tp7
# s.
with open(r"c:\pickle.txt","w") as f:pickle.dump(src_dic,f)

loads/load反序列化

from datetime import datetry:import cPickle as pickle    #python 2
except ImportError as e:import pickle   #python 3
src_dic = {"date":date.today(),"oth":([1,"a"],None,True,False),}
det_str = pickle.dumps(src_dic)
with open(r"c:\pickle.txt","r") as f:print pickle.load(f)
# {'date': datetime.date(2016, 10, 27), 'oth': ([1, 'a'], None, True, False)}

JSON和pickle模块的区别

1、JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。

2、JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。

转载于:https://www.cnblogs.com/tkqasn/p/6005025.html

python 序列化之JSON和pickle详解相关推荐

  1. python序列化模块json和pickle

    序列化相关 1. json 应用场景: json模块主要用于处理json格式的数据,可以将json格式的数据转化为python的字典,便于python处理,同时也可以将python的字典或列表等对象转 ...

  2. Java 关于序列化、Json和Gson详解

    文章目录 前言 序列化 什么是序列化 Java序列化 Java序列化.反序列化的基本用法 Java序列化的注意事项 JSON 和 Gson JSON概述 JSON语法规则 Gson Gson概述 Gs ...

  3. python3 json模块_详解python 3.6 安装json 模块(simplejson)

    JSON 相关概念: 序列化(Serialization):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是JSON,XML等.反序列化就是从存储区域(JSON,XML)读取反 ...

  4. python request.post 字典参数以json_Python requests.post方法中data与json参数区别详解

    在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json. data与json既可以是str类型,也可以是dict类型. 区别: 1.不管json是 ...

  5. python post json参数,Python requests.post方法中data与json参数区别详解

    在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json. data与json既可以是str类型,也可以是dict类型. 区别: 1.不管json是 ...

  6. python读取json格式文件大量数据,以及python字典和列表嵌套用法详解

    1.Python读取JSON报错:JSONDecodeError:Extra data:line 2 column 1 错误原因: JSON数据中数据存在多行,在读取数据时,不能够单单用open(), ...

  7. Python爬虫之selenium库使用详解

    Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...

  8. python镜像下载包_python包详解

    干货大礼包!21天带你轻松学Python(文末领取更多福利) 点击查看课程视频地址 本课程来自于千锋教育在阿里云开发者社区学习中心上线课程<Python入门2020最新大课>,主讲人姜伟. ...

  9. java json path_Java使用JSONPath解析JSON完整内容详解

    JsonPath是一种简单的方法来提取给定JSON文档的部分内容. JsonPath有许多编程语言,如Javascript,Python和PHP,Java. JsonPath提供的json解析非常强大 ...

  10. python中的subprocess.Popen()使用详解---以及注意的问题(死锁)

    从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值. subprocess意在替代其他几个老的模块或者函数 ...

最新文章

  1. C++的类什么时候需要虚析构函数
  2. 比特币核心(BCE)或许并没有你想象的强大
  3. 温度 数值模拟 matlab,西安交通大学 - 温度场数值模拟(matlab)
  4. Oracle数据库的一些常用命令
  5. C语言二分法求最小值解,C语言用二分法求方程的近似解的方法
  6. java后台处理ajax请求_java后台怎么对ajax请求的内容进行xss转义?
  7. 使用TFS CI/CD 完成 VSTS 插件自动化部署和发布
  8. 【深入理解JVM】:类加载器与双亲委派模型
  9. 前端学习(534):多列布局1
  10. 请求接受json tp5_关于jq jsonp跨域请求错误处理bug
  11. Jackson将json字符串转换成泛型List
  12. Mysql:SQL语句:DML语句
  13. Uinttest +excel结合使用--详细讲解
  14. 现代控制理论课程实验三:一阶倒立摆的LQR控制器设计
  15. 蓝天准系统P750的介绍与开箱
  16. MTK6589百度云ROM移植教程
  17. (2020/11/9)学习记录
  18. 2021年王道数据结构课后题
  19. Kali Linux Web 渗透测试秘籍 第七章 高级利用
  20. 我参加NVIDIA Sky Hackathon 训练文件的路径设置

热门文章

  1. C#断点续传HTTP下载远程文件的方法
  2. uboot 之环境变量
  3. devtmpfs文件系统创建设备节点
  4. java 设置系统参数_Java 设置系统参数和运行参数
  5. 路由重发布Route Redistribution
  6. (转)思科VPP源码分析(feature机制分析)
  7. Android 网络管理
  8. linux percpu机制解析
  9. x86系统微型计算机,80x86/Pentium 微型计算机原理及应用(第3版)
  10. python格式化字符串4种方法