1. 基本概念
1.1 Json
和Javascript
JSON
, 全称JavaScript Object Notation
,它通过对象和数组的组合来表示数据。在JavaScript
中一切都是对象,因此,任何支持的类型都可以通过JSON
来表示,常用的类型有数据和对象。
JavaScript
中,对象用{}
表示,例如{key1:value1, key2:value2...}
,数组用[]
,例如["jack", "hong",...]
一个JSON
对象可以写成如下,[]
和{}
可自由嵌套组合
[{
"name": "bob",
"gender": "male",
"birthday": "1992-10-18"
},{
"name": "john",
"gender": "female",
"birthday": "1995-10-18"
}]
1.2 json
对象和python
中字典的区别
相同点:
两者在写法上是一样的。
不同点:
- 1)字典是一种数据结构,
json
是一种格式; - 2)字典有很多内置函数,有多种调用方法,而
json
是数据打包的一种格式,并不像字典具备操作性 - 3)
json
是格式就会有一些形式上的限制,比如json
的格式要求必须且只能使用双引号作为key
或者值的边界符号,不能使用单引号,但字典就无所谓了
python提供了json
模块,可以方便的把json
格式的字符串转化为python
的数据结构。
2. 调用json.loads()
将json
文本字符串转为python
中的数据结构
2. 1 基本例子
import json
# 三个引号也是字符串
str = '''
[{
"name": "bob",
"gender": "male",
"birthday": "1992-10-18"
},{
"name": "john",
"gender": "female",
"birthday": "1995-10-18"
}]
'''
print(type(str))
data = json.loads(str)
print(data)
print(type(data))
输出结果:
<class 'str'>
[{'gender': 'male', 'name': 'bob', 'birthday': '1992-10-18'}, {'gender': 'female', 'name': 'john', 'birthday': '1995-10-18'}]
<class 'list'>
这里使用loads()
方法将json
字符串转化python
列表,那么可用索引获得相应值
data[0]['name']
data[0].get('name') # 字典都可以用get()方法来获取相应的值
结果都是 bob
,但推荐使用第二种;因为使用get()
方法,即使键名不存在,也不会报错,而是返回None
,如下
data[0].get('age')
data[0].get('age', 25)
# 输出如下
None
25 # key不存在时,返回默认值
注意:
变量str
中的数据需要用双引号来包着,不能用单引号,否则会报错
2.2 从文件中读取字符串内容,再用loads()
转化为列表
比如还用上面变量str
中的字符串,文件名为data.json
import json
with open('data.json', 'r') as file:
str = file.read()
data = json.loads(str)
print(data)
3. 调用json.dumps()
3.1 用dumps()
方法将列表转化为字符串,再用write()
方法写入文本
import json
data = [{
'name' : 'bob',
'gender': 'male',
'birthday': '1992-10-19'
}]
with open('data.json', 'w') as file:
file.write(json.dumps(data))
data.json
的文本内容为:
[{"name": "bob", "gender": "male", "birthday": "1992-10-19"}]
3.2 如果想保存JSON格式,可以加一个参数indent
,代表缩进字符个数
with open('data.json', 'w') as file:
file.write(json.dumps(data, indent=2))
得到的data.json
文本内容为
[
{
"name": "bob",
"gender": "male",
"birthday": "1992-10-19"
}
]
3.3. 有中文的情况下,需要指定ensure_ascii
为False
, 并且规定文件输出的编码
with open('data.json', 'w', encoding='utf-8') as file:
file.write(json.dumps(data, indent=2, ensure_ascii=False))