一, 什么是序列化
在我们存储数据或者网络传输数据的时候, 需要对我们的对象进行处理, 把对象处理成方便存储和传输的数据格式. 这个过程叫序列化, 不同的序列化结果也不同, 但目的是一样的, 都是为了存储和传输
在 Python 中三种序列化的方案:
pickle, 可以将我们 Python 中任意数据类型转化为 bytes 并写入到文件中. 同样也可以把文件中写好的 bytes 转换回到我们 Python 的数据 - 这个过程被称为反序列化.
shelve 简单另类的一种序列化方案. 有点类似于 Redis, 可以作为一种小型的数据库来使用.
JSON, 将 Python 中常见的字典, 列表转化成字符串, 是目前前后端数据交互使用频率最高的一种数据模式.
二, JSON
1. 什么是 JSON
JSON 是前后端交互的枢纽, 相当于编程界的普通话, 前后端用 Python 沟通. 因为 JSON 的语法格式可以完美的表示出一个对象. 那么什么是 JSON:JSON 全称 JavaScript object notation, 即 JS 对象简谱, 例如下面代码示例:
- {
- "id": 1,
- "title": "Python 从入门到放弃 (第二版)",
- "pub_date": "2018-01-11",
- "category": "Python",
- "publisher": {
- "id": 1,
- "name": "北京出版社"
- },
- "post_authors": [
- {
- "id": 2,
- "name": "佚名"
- }
- ]
- }
这段形如 Python 字典的东西在 JavaScript 里面叫 JSON, 其实是一样的. 我们发现用这样的数据结构可以完美的表示出任何对象, 并且可以完整的把对象表示出来. 只要代码格式比较好, 那么可读性也挺强的, 所以大家公认用这样一种数据结构作为数据交互的格式.
在 JSON 之前, 通常用的数据结构为 xml, 形如:
- <?xml version="1.0" encoding="utf-8" ?>
- <book>
- <title>Python 从入门到放弃 (第二版)</title>
- <pub_date>2018-01-11</pub_date>
- <category>Python</category>
- <publisher>
- <id>1</id>
- <name > 北京出版社 </name>
- </publisher>
- </book>
总之, xml 格式的文件在维护和处理上相比 JSON 文件很难解析, 所以后来大都倾向于使用 JSON 这一数据结构了.
2.JSON 在 Python 中的用法
字典 -> JSON
要先引入 JSON 模块, 再进行处理
- import JSON
- dic = {
- "姓名": "程序猿", "年龄": 28, "头发": None
- }
- s = JSON.dumps(dic)
- print(s)
- # 输出:
- >>>{
- "\u59d3\u540d": "\u7a0b\u5e8f\u733f", "\u5e74\u9f84": 28, "\u5934\u53d1": null
- }
结果很不友好啊. 那如何处理成中? 呢? 在 dumps 的时候给出另一个参数 ensure_ascii=False 就可以了了.
- import JSON
- dic = {
- "姓名": "程序猿", "年龄": 28, "头发": None
- }
- s = JSON.dumps(dic, ensure_ascii=False)
- print(s)
- # 输出:
- >>>{
- "姓名": "程序猿", "年龄": 28, "头发": null
- }
JSON -> 字典
上面介绍的是如何把字典格式的数据转化为 JSON, 那么怎么把前端传递过来的 JSON 文件转化为字典格式呢:
- import JSON
- s = '{" 姓名 ":" 程序猿 "," 年龄 ": 28," 头发 ": null}'
- # 注意此处要加引号, 表示 s 为字符串 - the JSON object must be str
- dic = JSON.loads(s)
- print(dic)
- print(type(dic))
- # 输出:
- >>> {
- '姓名': '程序猿', '年龄': 28, '头发': None
- }
- >>> <class 'dict'>
写入 / 读取 JSON 文件
JSON 也可以像 pickle 一样把序列化的结果写入到文件中:
来源: http://www.bubuko.com/infodetail-2919744.html