Json 是一种非常通用的数据格式, 在 Python 中使用也非常方便. Python 中有内置的 json 模块, 用来编码和解码 json 数据, 其使用也很简单, 在日常运维工作中非常实用.


目录

  1. Python 中的 JSON 模块
  2. 序列化和反序列化
  3. JSON 数据反序列化
  4. Python 数据序列化
  5. 自定义格式数据序列化和反序列化

Python 中的 JSON 模块

要使用 json 非常简单, 直接 导入该模块就行.

1
2
3
import json
## or simply
import json as js

序列化和反序列化

将 python 数据 (list or dict) 编码成 json 数据的过程通常叫 序列化 (serialization), 相反地则叫做 反序列化(deserialization). Python 中还有类似的模块 - picklemarshal, 三者的函数是类似的, 但是后两个是 python 专用的, json 则是通用的.

JSON 数据反序列化

json 模块提供了从 json 文件和 json 数据转换到 Python 数据格式的接口: json.load()json.loads(). json 到 python 的数据格式转换如下表所示.

JSON Python
object dict
array array
string str
number(int) int
number(real) float
true True
false False
null None

json.load() 接受一个 file-like object (open("file"))作为参数, 而不是文件名, json.loads() 则是接受一个 string 作为输入.
作为开始, 我们先从一个 json 文件中通过 json.load()来读取数据. 下面是一个简单的 json 文件.

simple.json: a simple json file
1
2
3
4
{
"name": "Amito",
"email": "me@amito.me"
}

我们在 Python 中导入 json 文件

1
2
3
4
>>>import json
>>>data=json.load(open("simple.json","r")
>>>print(data)
{'name': 'Amito', 'email': 'me@amito.me'}

如果你有从别处获取的 json 数据或者 json 格式的 string, 可以通过 json.loads() 来转换到 Python 格式, 多出来的 s 可能就是代表了 string.

1
2
3
4
5
6
7
8
9
10
>>> json_string="""
{
"name":"Amito",
"email":"me@amito.me",
"note":"from json string"
}
"""
>>>data = json.loads(json_string)
>>>print(data)
{'name': 'Amito', 'email': 'me@amito.me', 'note': 'from json string'}

Python 数据序列化

下面是 Python 对象序列化时和 json 数据格式之间的一个直观的对应.

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

json.dump() 会将 python 数据序列化到一个文件对象中, json.dumps() 则会序列化到一个 json string 中. 仍旧以上面的 json 文件作为例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>>data=json.load(open("simple.json","r"))
>>>type(data)
dict
#### dump to a file object
>>>with open("simple.de.json","w") as out:
json.dump(data, out)
### dumps to a string
>>>json_string = json.dumps(data)
>>>type(str)
str
>>>print(json_string)
{'name': 'Amito', 'email': 'me@amito.me', 'note': 'from json string'}
#### beautify json_string and print json pretty
>>>json_string=json.dumps(data,indent=4)
>>>print(json_string)
{
"name": "Amito",
"email": "me@amito.me",
"note": "from json string"
}

自定义格式数据序列化和反序列化

todo…