Python JSON使用举例
HDUZN

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)) # "\u6c34\u6d52\u4f20"
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)) # 缩进2个
print(json.dumps(book, ensure_ascii=False, indent=4)) # 缩进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 = {'水浒传':'施耐庵', '三国演义':'罗贯中', '红楼梦':'曹雪芹'}
# dumps 方法将数据对象序列化为 json格式的字符串
json_info = json.dumps(book, ensure_ascii=False, indent=4)
print(json_info)
print(type(book)) # <class 'dict'>
print(type(json_info)) # <class 'str'>

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)) # <class 'list'>

输出结果如下:

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)
# 1.json.dumps(obj) 方法将数据对象序列化为 json格式的字符串
json_info = json.dumps(book, ensure_ascii=False, indent=4)
print(json_info)
print(type(book)) # <class 'dict'>
print(type(json_info)) # <class 'str'>

print('-'*10 + '反序列化为Python数据对象' + '-'*10)
# 2.json.loads(s) 方法把json格式的字符串变为 Python中的数据对象
trans_info = json.loads(json_info, strict=False)
print(trans_info)
print(type(trans_info)) # <class 'dict'>

输出结果如下:

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)
# 3.json.dump(obj, fp) 方法将python数据类型转换并保存到json格式的文件内
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)
# 4.json.load(fp) 方法读取 json文件内容并转换为python的类型
with open(r'.\book.json', 'r') as f:
data = json.load(f)
f.close()
print(data)
print(type(data)) # <class 'list'>

官方文档:json — JSON 编码和解码器

  • 本文标题:Python JSON使用举例
  • 本文作者:HDUZN
  • 创建时间:2022-07-12 14:29:00
  • 本文链接:http://hduzn.cn/2022/07/12/Python-JSON使用举例/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论