使用json模块处理json数据首先要先导入。
import json
1,它是处理字典与json字符串之间的转换问题,字典是一种数据结构,他有很多方法可供调用,而json只是一种特定格式的数据,json字符串是符合json格式的字符串。
字典里key和value的值的类型可以是任何类型,一般使用单引号,但不强制比如以下字典的定义:
dic1 = {'str1':'hello world!', 1:5, 't1':(1,2,3), 'l1':[1,2,3], 'sub_dic':{'sub_str':'abcdef', 'sub_list':[1,2]}}
但是json必须使用双引号定义,且key必须有双引号,以上字典转换为json字符串为:
json1 = json.dumps(dic1,ensure_ascii=False,indent=4)
print(json1)
print(type(json1))
运行结果:
{
"1": 5,
"t1": [
1,
2,
3
],
"str1": "hello world!",
"l1": [
1,
2,
3
],
"sub_dic": {
"sub_str": "abcdef",
"sub_list": [
1,
2
]
}
}
<class 'str'>
可见所有的单引号变为双引号,key都被双引号括住,整个json字符串的格式其实就是字符串。
再将上面的字符串转换为dict:
dic2 = json.loads(json1)
print(dic2)
print(type(dic2))
运行结果:
{'l1': [1, 2, 3], 'str1': 'hello world!', 'sub_dic': {'sub_list': [1, 2], 'sub_str': 'abcdef'}, 't1': [1, 2, 3], '1': 5}
<class 'dict'>
从json字符串转化为字典,格式上看可以看到只是双引号变成了单引号,没有其他变化。
2,如果是往文件内写入字典类型的数据或者从文件内读取出字典数据就要用到dump和load。
文件里存储的数据为json格式的字符串,读出后转化为字典:
with open('user.json', 'a+', encoding='utf-8') as f:
f.seek(0) #a+模式下打开文件,文件指针在最后,读取时需要放到最前面
users = json.load(f) #读取文件内容,且同时转换为字典
print(users)
print(type(users))
运行结果:
{'xiaoma': {'addr': '北京', 'password': 12345, 'age': 18, 'sex': '男'}, 'xiaohei': {'addr': '北京', 'password': 12345, 'age': 18, 'sex': '男'}, 'xiaowang': {'addr': '北京', 'password': 12345, 'age': 18, 'sex': '男'}}
<class 'dict'>
下面说下写入字典数据:
将上述定义的dic1 = {'str1':'hello world!', 1:5, 't1':(1,2,3), 'l1':[1,2,3], 'sub_dic':{'sub_str':'abcdef', 'sub_list':[1,2]}}写入文件user.json里:
with open('user.json', 'a+', encoding='utf-8') as f:
json.dump(dic1, f, ensure_ascii=False, indent=4) #dic1为需要写入的字典数据,f是文件对象,有中文需要将ensure_ascii设置为False,indent是缩进格式
执行后可以看到文件内多了新写入的字典数据。
需要注意是,最后文件里包含了两个json字符串,此时再对文件使用load进行读取操作将会报错,文件中只有一个json字符串,无其他多余内容时才可以使用load读取