天天看点

测开不得不会的python之json数据转换

作者:科雷软件测试

学习目录

json数据实际上是特殊格式的字符串

json数据和python数据类型对照表

内置json库

通过import json导入json库,提供了四个常用的函数

json.load(0使用

json.dumps()使用

json.dump()使用

json.load()使用

json.dump和json.dumps函数的参数

测开不得不会的python之json数据转换

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}

测开不得不会的python之json数据转换

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
           

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

测开不得不会的python之json数据转换

--感谢读者的阅读和学习,谢谢大家。