日常编程工作中,JSON是接口传递数据的默认格式,对json文件的解析是很常见的步骤。Python的第三方库JSON让解析json文件变得很简单。
在编写接口传递数据时,往往需要使用JSON对数据进行封装。python和json数据类型的转换,看作为编码与解码。
JSON 函数
使用 JSON 函数需要导入 json 库:import json。
函数 | 描述 |
---|---|
json.dumps | 将 Python 对象编码成 JSON 字符串-转换为string (易传输) |
json.dump | 将dict类型转换为json字符串格式,写入到文件 (易存储) |
json.loads | 针对内存对象将已编码的 JSON 字符串解码为 Python |
json.load | 针对文件句柄,将json格式的字符转换为dict,从文件中读取 (将string转换为dict) |
json格式与python格式的对应
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
1,读取json文件
json文件内容本质上字符串,当我们拿到json文件后只有转换成字典才方便使用,方便获取需要的字段;
import json
# json示例
{
"version": "1.0",
"modelinfo": [
{
"versionid": "V1",
"netypes": ["ITBBU"],
"subtypes": ["NR"]
}
]
}
{'version': '1.0',
'modelinfo': [{'versionid': 'V1', 'netypes': ['ITBBU'], 'subtypes': ['NR']}]}
jsonpath = "E:/temp_files/test.json"
with open(jsonpath, 'r', encoding='utf-8') as f:
jsondata = json.load(f)
print('jsondata 数据类型:',type(jsondata))
输出:
jsondata 数据类型: <class ‘dict’>
# json文件转换成字典后,我们就可以向字典一样取数据了
version = jsondata["version"]
print('version:',version)
netypes = jsondata["modelinfo"][0]["netypes"]
print('netypes: ',netypes)
输出:
version: 1.0
netypes: [‘ITBBU’]
2 将字典转换成json 文件
# 将字典写入到json文件中
newdict = {"test": [1,2,"English","中文"],"date": "2020/8/20 12:12:10"}
with open(jsonpath, 'a', encoding='utf-8') as f:
json.dump(newdict, f, ensure_ascii=False) # 如果ensure_ascii 为false,则返回值可以包含非ascii值
3 将json字符串转换成字典
json_str = '{"test": [1, 2, "English", "中文"], "date": "2020/8/20 12:12:10"}'
print('这是转换后的数据:',json.loads(json_str)) # 注意是loads,有s
print('这是转换后的数据类型:',type(json.loads(json_str)))
这是转换后的数据: {'test': [1, 2, 'English', '中文'], 'date': '2020/8/20 12:12:10'}
这是转换后的数据类型: <class 'dict'>
4 将字典转换成json字符串
dicts = {
"key1": "asdf",
"key2": "jkl"
}
print('这是将字典转换之后的数据:',json.dumps(dicts,ensure_ascii=False))
print('这是将字典转换之后的数据类型:',type(json.dumps(dicts,ensure_ascii=False)))
这是将字典转换之后的数据: {"key1": "asdf", "key2": "jkl"}
这是将字典转换之后的数据类型: <class 'str'>
5 虽然字典是最常见的类型,但是其他数据类型也是可以的
import json
print("start to working....")
py_ob = [1, 2.0, "string", True]
jsonpath = "E:/temp_files/test2.json"
with open(jsonpath,'w',encoding='utf-8') as f:
json.dump(py_ob,f,ensure_ascii=False)
with open(jsonpath,'r',encoding='utf-8') as f2:
py = json.load(f2)
print(type(py)) # <class 'list'>
print(py) # [1, 2.0, 'string', True]
json_ob = json.dumps(py_ob)
print(type(json_ob)) # <class 'str'>
print(json_ob) # [1, 2.0, "string", true]
py_ob2 = json.loads(json_ob,encoding='utf-8')
print(type(py_ob2)) # <class 'list'>
print(py_ob2) # [1, 2.0, 'string', True]
输出:
start to working…
<class ‘list’>
[1, 2.0, ‘string’, True]
<class ‘str’>
[1, 2.0, “string”, true]
<class ‘list’>
[1, 2.0, ‘string’, True]
总结:不管是dump还是load,带s的都是和字符串相关的,不带s的都是和文件相关的。
参考:https://www.cnblogs.com/jfl-xx/p/7992985.html
https://www.runoob.com/python/python-json.html