JSON是一种轻量级的数据交换格式。易于人类的阅读和编写,同时也易于机器解析和生成,是目前应用最广泛的数据交换格式。
像一些开放API接口,很多返回数据也都有json格式。这样跨语言、跨平台使用就很方便了。
比如这样的json数据(注意json中都是双引号):
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [ { "name": "水浒传", "author": "施耐庵", "time": "2016-09-01", "isbn": "1111222233444" }, { "name": "三国演义", "author": "罗贯中", "time": "2017-09-01", "isbn": "1111222233555" } ]
|
JSON函数
Python里用json也很方便,主要就四个函数。
最主要是前两个处理字符串的,后两个是处理文件的:
1 2 3 4 5
| json.dumps(obj):将Python对象序列化成json字符串 json.loads(s):将已编码的json字符串反序列化为Python对象
json.dump(obj,fp):将python数据类型转换并保存到json格式的文件 json.load(fp):从json格式的文件中读取数据并转换为python的类型
|
使用 JSON 函数需要导入 json 库:import json
。
1. json.dumps(obj) 序列化成json字符串
语法:
1
| 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)
|
2个重要参数:
1).ensure_ascii 参数
默认的话是 ensure_ascii=True
,这个当有中文字符的时候就会有问题,默认True表示使用ascii编码。如果想输出正常中文,就要设置成 ensure_ascii=False
。
1 2 3 4
| import json s = '水浒传' print(json.dumps(s)) print(json.dumps(s, ensure_ascii=False))
|
2).indent 参数
默认是 indent=None
,表示没有格式。indent后面的数值表示缩进的空格数。看下例子就懂了。
1 2 3 4 5 6
| import json book = {'水浒传':'施耐庵', '三国演义':'罗贯中', '红楼梦':'曹雪芹'} print(json.dumps(book, ensure_ascii=False)) print(json.dumps(book, ensure_ascii=False, separators=(',',':'))) print(json.dumps(book, ensure_ascii=False, indent=2)) print(json.dumps(book, ensure_ascii=False, indent=4))
|
输出结果为:
1 2 3 4 5 6 7 8 9 10 11 12
| {"水浒传": "施耐庵", "三国演义": "罗贯中", "红楼梦": "曹雪芹"} {"水浒传":"施耐庵","三国演义":"罗贯中","红楼梦":"曹雪芹"} { "水浒传": "施耐庵", "三国演义": "罗贯中", "红楼梦": "曹雪芹" } { "水浒传": "施耐庵", "三国演义": "罗贯中", "红楼梦": "曹雪芹" }
|
还有两个参数:
sort_keys=False
:默认是没排序的,可以按照key来排序;
separators=None
:如果设置成separators=(',',':')
表示元素之间用逗号隔开,key和value之间用冒号隔开(这里没有空格,需要空格就加上,默认是有的)
举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import json
book = {'水浒传':'施耐庵', '三国演义':'罗贯中', '红楼梦':'曹雪芹'}
json_info = json.dumps(book, ensure_ascii=False, indent=4) print(json_info) print(type(book)) print(type(json_info))
book_info = [ { 'name': '水浒传', 'author': '施耐庵', 'time': '2016-09-01', 'isbn': '1111222233444' }, { 'name': '三国演义', 'author': '罗贯中', 'time': '2017-09-01', 'isbn': '1111222233555' } ] json_info2 = json.dumps(book_info, ensure_ascii=False, indent=4) print(json_info2) print(type(book_info))
|
输出结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| { "水浒传": "施耐庵", "三国演义": "罗贯中", "红楼梦": "曹雪芹" } <class 'dict'> <class 'str'> [ { "name": "水浒传", "author": "施耐庵", "time": "2016-09-01", "isbn": "1111222233444" }, { "name": "三国演义", "author": "罗贯中", "time": "2017-09-01", "isbn": "1111222233555" } ] <class 'list'>
|
一般比较常用的应该就是python的dict字典或list列表编码成json格式字符串。
2. json.loads(s) 反序列化成Python数据对象
语法:
1
| json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
|
1个重要参数:
strict 参数
默认是strict=True
,是不能有控制字符的,如果有,会报一个错:
ValueError Invalid control character……
官方文档中也有这个参数的说明:
如果 strict 为 false (默认为 True ),那么控制字符将被允许在字符串内。在此上下文中的控制字符编码在范围 0–31 内的字符,包括 ‘\t’ (制表符), ‘\n’ , ‘\r’ 和 ‘\0’
所以,一般我们就直接设为strict=False
。
举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import json book = {'水浒传':'施耐庵', '三国演义':'罗贯中', '红楼梦':'曹雪芹 '}
print('-'*10 + '序列化为json格式字符串' + '-'*10)
json_info = json.dumps(book, ensure_ascii=False, indent=4) print(json_info) print(type(book)) print(type(json_info))
print('-'*10 + '反序列化为Python数据对象' + '-'*10)
trans_info = json.loads(json_info, strict=False) print(trans_info) print(type(trans_info))
|
输出结果如下:
1 2 3 4 5 6 7 8 9 10 11
| ----------序列化为json格式字符串---------- { "水浒传": "施耐庵", "三国演义": "罗贯中", "红楼梦": "曹雪芹 " } <class 'dict'> <class 'str'> ----------反序列化为Python数据对象---------- {'水浒传': '施耐庵', '三国演义': '罗贯中', '红楼梦': '曹雪芹 '} <class 'dict'>
|
3. json.dump(obj,fp) 保存到json格式的文件
语法:
1
| 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)
|
2个重要参数:
跟json.dumps(obj)
一样的,主要就是ensure_ascii 和 indent。
举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import json book_info = [ { 'name': '水浒传', 'author': '施耐庵', 'time': '2016-09-01', 'isbn': '1111222233444' }, { 'name': '三国演义', 'author': '罗贯中', 'time': '2017-09-01', 'isbn': '1111222233555' } ] print('-'*10 + '保存到json格式的文件' + '-'*10)
with open(r'.\book.json', 'w') as f: json.dump(book_info, f, ensure_ascii=False, indent=4)
|
4.json.load(fp) 读取json格式文件数据
语法:
1
| json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
|
举例:
1 2 3 4 5 6 7 8
| import json print('-'*10 + '读取json文件内容' + '-'*10)
with open(r'.\book.json', 'r') as f: data = json.load(f) f.close() print(data) print(type(data))
|
官方文档:json — JSON 编码和解码器