学习目录
json数据实际上是特殊格式的字符串
json数据和python数据类型对照表
内置json库
通过import json导入json库,提供了四个常用的函数
json.load(0使用
json.dumps()使用
json.dump()使用
json.load()使用
json.dump和json.dumps函数的参数
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,目前被广泛应用,在实际使用过程中不管是开发工程师还是测试工程师都必须学会json数据的处理。
Python中有几个库可以比较好的处理json数据,比如内置库json、外部库Demjson、jsonpath。本章主要介绍内置库json的使用。
Json数据实际上是特殊格式的字符串
#定义一个json字符串
json_data = '{"name":"lili","age":20}'
print(f'json数据是否是字符串: {isinstance(json_data,str)}')
#打印结果
json数据是否是字符串: True
json数据和python数据类型对照表
json字符串和python数据转换的对照表如下
JSON | Python |
object | dict |
array | list、tuple |
string | unicode、str |
number (int) | int, long |
number (real) | float |
true | True |
false | False |
null | None |
内置json库
通过import json导入json库,提供了四个常用的函数
函数 | 描述 |
json.dumps() | 将Python对象转换成JSON字符串 |
json.loads() | 将已编码的 JSON 字符串转换为Python对象 |
json.dump() | 将为Python对象转换为JSON文件对象 |
json.load() | 将JSON文件对象转换为Python对象 |
Json.loads()使用
定义一个josn数据
json_data = '{"name":"lili","age":20,"address":["china","js","nj"],
"man":true,"woman":false,"money":null}'
传入json数据转换为python对象
python_dictinfo = json.loads(json_data)
print(f'json数据转换后为字典: {isinstance(python_dictinfo,dict)}')
#json数据转换后为字典
json数据转换后为字典: True
转为字典后就可以对其进行字典的一些操作
#提取key对应的值
print(f"name : {python_dictinfo['name']}")
print(f"address : {python_dictinfo['address']} 该项是python的列表:{isinstance(python_dictinfo['address'],list)}")
#打印结果
name : lili
address : ['china', 'js', 'nj'] 该项是python的列表:True
json.dumps()使用
定义一个字典
python_dictinfo = {'name': 'lili', 'age': 20,
'address': ['china', 'js', 'nj'],
'man': True, 'woman': False, 'money': None}
传入字典转换为json数据
json_data = json.dumps(python_dictinfo)
print(f'转换后的json数据: {json_data}')
#打印结果
转换后的json数据: {"name": "lili", "age": 20, "address": ["china", "js", "nj"], "man": true, "woman": false, "money": null}
json.dump()使用
定义一个字典
python_dictinfo = {'name': 'lili', 'age': 20, 'address': ['china', 'js', 'nj'],
'man': True, 'woman': False, 'money': None}
传入字典和文件对象将数据写入json文件
#写入test.json文件
with open('test.json','w') as fd:
json.dump(python_dictinfo,fd)
程序执行后在本地会生成一个test.json文件,内容如下:
{"name": "lili", "age": 20.0, "address": ["china", "js", "nj"], "man": true, "woman": false, "money": null}
Json.load()使用
传入文件对象,解析为字典
with open('test.json','r') as fd:
python_dictinfo = json.load(fd)
print (f'解析出的字典: {python_dictinfo}')
解析出的字典: {'name': 'lili', 'age': 20.0, 'address': ['china', 'js', 'nj'], 'man': True, 'woman': False, 'money': None}
json.dump和json.dumps函数的参数
这两个函数的一些参数配置可使转换后的json数据更美观更容易阅读
默认的参数如下:
skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
default=None, sort_keys=False
- sort_keys参数
如果传入sort_keys为True,转换为json时讲按照传入的字典进行排序。
python_dictinfo = { 'name': 'lili', 'age': 20}
json_data = json.dumps(python_dictinfo,sort_keys=True)
print(f'转换后的json数据: {json_data}')
#打印排序后的结果
转换后的json数据: {"age": 20, "name": "lili"}
- indent参数
indent传入的是非负整数,则JSON数组元素和对象成员将使用该缩进进行漂亮的打印
python_dictinfo = {"name":"lili","age":20.00,"address":["china","js","nj"],"man":True,"woman":False,"money":None}
json_data = json.dumps(python_dictinfo,indent=4)
print(f'转换后的json数据: {json_data}')
转换后的json数据:
{
"name": "lili",
"age": 20.0,
"address": [
"china",
"js",
"nj"
],
"man": true,
"woman": false,
"money": null
}
- separators参数
表示“分隔符”,默认值为(',',':'),如果指定为其他的元组,比如('a','b'),意味着原来的逗号会被替换为a,原来的冒号会被替换为b,并去掉后面的空格。
python_dictinfo = python_dictinfo = { 'name': 'lili', 'age': 20}
json_data = json.dumps(python_dictinfo,separators=('a','b'))
print(f'转换后的json数据: {json_data}')
#打印结果
转换后的json数据: {"name"b"lili"a"age"b20}
- skipkeys参数
默认值是False,如果“skipkeys”为True,则非python基本数据类型的“dict”键
(“str”、“int”、“float”、“bool”、“None”),将被跳过而不会引发“TypeError”。
#定义一个元组的键
python_dictinfo = {'name': 'lili', 'age': 20, ('china', 'js', 'nj'): None}
json_data = json.dumps(python_dictinfo)
print(f'转换后的json数据: {json_data}')
#执行后报错
TypeError: keys must be str, int, float, bool or None, not tuple
添加参数skipkeys=True
json_data = json.dumps(python_dictinfo,skipkeys=True)
print(f'转换后的json数据: {json_data}')
#打印结果 会忽略掉元组键值
转换后的json数据: {"name": "lili", "age": 20}
- ensure_ascii参数
默认值True,输出ASCLL码,如果配置为False,可以输出中文。
python_dictinfo = {'name': '王磊', 'age': 20 }
json_data = json.dumps(python_dictinfo)
print(f'转换后的json数据: {json_data}')
#结果如下
转换后的json数据: {"name": "\u738b\u78ca", "age": 20}
配置为False后可打印中文
json_data = json.dumps(python_dictinfo,ensure_ascii=False)
print(f'转换后的json数据: {json_data}')
#结果如下
转换后的json数据: {"name": "王磊", "age":20}
- check_circular参数
如果check_circular为false,则跳过对容器类型的循环引用检查,循环引用将导致溢出错误(或更糟的情况)。
- allow_nan参数
默认为True,序列化超出范围的浮点值(nan、inf、-inf)转为json格式 (nan、Infinity、-Infinity)。如果为False,则执行时会报错。
python_dictinfo = {'name': 'lili', 'age': float('inf')}
json_data = json.dumps(python_dictinfo,allow_nan=False)
# allow_nan=False 则执行时会报错
ValueError: Out of range float values are not JSON compliant: inf
共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”
-----指水滴不断地滴,可以滴穿石头;
-----比喻坚持不懈,集细微的力量也能成就难能的功劳。
--感谢读者的阅读和学习,谢谢大家。