1. 序列化的简单概念

2. json 标准库

2.1 json.dumps()

2.2 json.loads()

2.3 json.dump()

2.4 json.load()

1. 序列化的简单概念

我们平常对 python 对象所进行的操作是在内存中的,当程序关闭时这些对象就会被清空,所以我们需要用一种合适的方法将这些数据保存下来。

为了将我们的数据进行永久存储,需要引入序列化(pickling/serialization)的概念。

  • 序列化的定义:将 python 对象编码成一个二进制数据集合(数据流);反序列化:将数据流解码成 python 对象。
  • 序列化的好处:我们可以通过网络或本地存储介质将这些数据流进行传输或保存。
  • 序列化的方法:引入 json、pickling、marshal、shelve 等,其中最常用的是 json。

2. json 标准库

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写。

基本用法

序列化方法

  • json.dumps():处理的是python对象,将 python 对象序列化为 json 字符串。
  • json.dump():处理的是文件对象,将序列化后的 json 字串保存到文件。

反序列化方法

  • json.loads():处理的是python对象,将已编码的 json 字符串反序列为 python 对象。
  • json.load():处理的是文件对象,从文件接收 json 字串并反序列化为 python 对象。

  

2.1 json.dumps()

将 python 对象编码(序列化)成 json 字符串。

语法

json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, 
  indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)

较重要的参数:

  • sort_keys:是否按键排序
  • indent:定义缩进大小
  • separators:是一个元组,定义分隔符的类型(键之间的分隔符, 键值之间的分隔符)
  • skipkeys:是否允许json字串编码字典对象时,字典的key不是字符串类型(默认是不允许)

示例:

1 >>> import json
2 >>> json.dumps({"name":"xiaoming", "age": 18}) # 将字典对象编码成json串(即字符串类型)
3 '{"name": "xiaoming", "age": 18}'
4 >>> json.dumps([]) # 将列表对象编码成json串
5 '[]'
6 >>> json.dumps("string") # 将字符串对象编码成json串
7 '"string"'
8 >>> json.dumps(1) # 将数字对象编码成json串
9 '1'

使用参数让 json 数据格式化输出

示例1:

1 >>> print(json.dumps({'b': 'Runoob', 'a': 7}, sort_keys=True, indent=4, separators=(',', ': ')))
2 {
3 "a": 7,
4 "b": "Runoob"
5 }

示例2:

 1 >>> a = ['foo', {'bar': ('baz', None, 1.0, 2)}]
2 >>> print(json.dumps(a, sort_keys=True, indent=4, separators=('!', '?'))) # 分隔符这里只是测试,一般保持默认逗号和分号即可
3 [
4 "foo"!
5 {
6 "bar"?[
7 "baz"!
8 null!
9 1.0!
10 2
11 ]
12 }
13 ]

Python 原始类型向 JSON 类型的转化对照表

Python JSON
dict object
list, tuple array
str, unicode string
int, long, float number
True true
False false
None null

示例:

 1 # 字典对象转json串
2 >>> data = {'b':None, 'c':(1,2), 'a':True, 'd':1.221}
3 >>> json_data = json.dumps(data)
4 >>> print(json_data)
5 {"b": null, "c": [1, 2], "a": true, "d": 1.221}
6
7 # json串转回字典对象
8 >>> dict_data = json.loads(json_data)
9 >>> print(dict_data)
10 {'b': None, 'c': [1, 2], 'a': True, 'd': 1.221}

2.2 json.loads()

将 json 字串解码成 python 的数据类型,也就是反序列化。

语法

json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

示例

1 >>> import json
2 >>> jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}'
3 >>> type(jsonData)
4 <class 'str'>
5 >>> rep = json.loads(jsonData)
6 >>> rep
7 {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
8 >>> type(rep)
9 <class 'dict'>

JSON 类型转换到 Python 的类型对照表

JSON Python
object dict
array list
string unicode
number (int) int, long
number (real) float
true True
false False
null None

2.3 json.dump()

将序列化之后的JSON字串保存到文件中。

json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, 
  allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

示例:

 1 import json
2
3 data = {"name":"xiaoming", "age":21, "gender":"boy"}
4
5 # 第一种方法:使用json.dumps()
6 with open("e:\\json1.txt", "w") as f:
7 f.write(json.dumps(data, indent=4))
8
9 # 第二种方法:使用json.dump()
10 with open("e:\\json2.txt", "w") as f:
11 json.dump(data, f, indent=4)

执行结果(文件内容):

{
"name": "xiaoming",
"age": 21,
"gender": "boy"
}

2.4 json.load()

从文件中接收 JSON 串,并反序列化为 Python 的数据类型。

json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

示例:

 1 import json
2
3 data = {"name":"xiaoming", "age":21, "gender":"boy"}
4
5 # 将json串写入文件中
6 with open("e:\\json3.txt", "w") as f:
7 json.dump(data, f, indent=4)
8
9 ## 读取json串
10
11 # 方法1:json.loads()
12 with open("e:\\json3.txt", "r") as f:
13 print(json.loads(f.read()))
14
15 # 方法2:json.load(open())
16 print(json.load(open("e:\\json3.txt")))
17
18 # 方法3:json.load() + with open()
19 with open("e:\\json3.txt") as f:
20 print(json.load(f))

json 标准库的更多相关文章

  1. golang中的标准库数据格式

    数据格式介绍 是系统中数据交互不可缺少的内容 这里主要介绍JSON.XML.MSGPack JSON json是完全独立于语言的文本格式,是k-v的形式 name:zs 应用场景:前后端交互,系统间数 ...

  2. Python常用标准库(pickle序列化和JSON序列化)

    常用的标准库 序列化模块 import pickle 序列化和反序列化 把不能直接存储的数据变得可存储,这个过程叫做序列化.把文件中的数据拿出来,回复称原来的数据类型,这个过程叫做反序列化. 在文件中 ...

  3. Python 标准库 urllib2 的使用细节[转]

    转自[http://zhuoqiang.me/python-urllib2-usage.html] Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节描述的并不清楚,比 ...

  4. Python标准库与第三方库详解(转载)

    转载地址: http://www.codeweblog.com/python%e6%a0%87%e5%87%86%e5%ba%93%e4%b8%8e%e7%ac%ac%e4%b8%89%e6%96%b ...

  5. Python 标准库 urllib2 的使用细节

    刚好用到,这篇文章写得不错,转过来收藏.    转载自 道可道 | Python 标准库 urllib2 的使用细节 Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节 ...

  6. 完成OSS.Http底层HttpClient重构封装 支持标准库

    OSS.Http项目对于.Net Standard标准库的支持已经迁移完毕,OSS开源系列两个最底层的类库已经具备跨运行时支持的能力.由于OSS.Http类库是几年前我参照RestSharp的思路,完 ...

  7. 微信和支付宝支付模式详解及实现(.Net标准库)- OSS开源系列

    支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成. ...

  8. [python标准库]Pickle模块

    Pickle-------python对象序列化 本文主要阐述以下几点: 1.pickle模块简介 2.pickle模块提供的方法 3.注意事项 4.实例解析 1.pickle模块简介 The pic ...

  9. python 标准库 -- requests

    一. 安装 $ pip install requests requests 并不是python 标准库, 但为了汇总方便, 将其放置于此. 二. 用法 requests.get() : GET 请求 ...

随机推荐

  1. 第47天打卡学习(单例模式 深入了解CAS 原子引用 各种锁的理解)

    18彻底玩转 单例模式 饿汉式 DCL懒汉模式 探究! 饿汉式  package com.kuang.single; //饿汉式单例 //单例模式重要思想是构造器私有 public class Hun ...

  2. wxWidgets源码分析(1) - App启动过程

    目录 APP启动过程 wxApp入口定义 wxApp实例化准备 wxApp的实例化 wxApp运行 总结 APP启动过程 本文主要介绍wxWidgets应用程序的启动过程,从app.cpp入手. wx ...

  3. HDOJ-6656(数论+逆元)

    Kejin Player HDOJ-6656 设f[i]为从i升级到i+1期望需要的金钱,由于每级都是能倒退或者升级到i+1,所以询问从l,r的期望金钱可以直接前缀和,那么推导每一级升级需要的期望钱也 ...

  4. Azure Front Door(一)为基于.net core 开发的Azure App Service 提供流量转发

    一,引言 之前我们讲解到使用 Azure Traffic Manager.Azure LoadBalancer.Azure Application Gateway,作为项目的负载均衡器来分发流量,转发 ...

  5. CISCN-2018-Quals-note-service2

    CISCN-2018-Quals-note-service2 总结 做完这道题,收获如下: 1)汇编语句jmp short s,最后编译出来的机器码为\xEB\x??,问号代表pc寄存器会往前或往后跳 ...

  6. 再来认识一下 Java 序列化

    前言 在面试中,Java 序列化被问到的几率还是挺高的.所以搜集了 Java 序列化常见的问题,由浅入深的帮助大家进一步学习和理解. 序列化基础知识 什么是序列化? Java 序列化是 JDK 1.1 ...

  7. mysql内一些可以报错注入的查询语句

        一.exp() 取反参数 该函数简单来说就是,以e为底的对数,在当传递一个大于709的值时,函数exp()就会引起一个溢出错误,取反则可以导致很小的数值变得很大,比如说0 这样既可配合使用,e ...

  8. [NOIP 2020] 微信步数

    一.题目 点此看题 二.题目 首先感谢一下这位大佬的博客,虽然我看不懂您的讲解,但是还是读得懂代码的 思路是 \(\tt jys\) 给我讲明白的,首先我们可以感觉到快速计算它肯定和矩形有关系,也就是 ...

  9. PTE 准备之 Describe Image

    25s 准备时间:决定用什么模板,用模板cover那些信息点 Content: 数字和文字哪个多,就多说哪个,均匀覆盖 Fluency : 保持流利度 不要纠结时态,单复数,人称代词等 时间要求: 尽 ...

  10. MySQL中explain语句的使用

    一.概述 在 MySQL 中,我们可以使用慢查询日志或者 show processlist 命令等方式定位到执行耗时较长的 SQL 语句,在这之后我们可以通过 EXPLAIN或者 DESC 命令获取 ...