【Python接口自动化测试】(9)JSON 类型解析

JSON 类型解析

1、序列化和反序列化

  程序中的对象,如Python中的字典、列表、函数、类等,都是存在内存中的,一旦断电就会消失,不方便传递或存储,所以我们需要将内存中的对象转化为文本或者文件格式,来满足传输和持久化(存储)需求。
  • 序列化: 内存对象 -> 文本/文件
  • 反序列化: 文本 -> 内存对象
  对象在HTTP中的传输过程 HTTP协议是超文本传输协议,是通过文本或二进制进行传输的,所以我们发送的请求要转化成文本进行传输,收到的响应也是文本格式,如果是JSON,一般还需要将文本格式重新转化为对象
  JSON对象(Python字典) -> 转为文本请求 -> 发送请求 -> 服务器收到文本请求 -> 将文本请求转化为对象,获取其中的参数,处理业务 -> 返回文本格式的响应 -> 客户端转为对象格式来从响应中取值

2、JSON对象与Python字典的区别

2.1 JSON对象是javascript object即javascript中的对象,是一种通用的格式,格式严格,不支持备注。
  • JSON文本是符合JSON格式的文本,实际上是一个字符串
  • JSON对象是内存中一个对象,拥有属性和方法,可以通过对象获取其中的参数信息
  • Python中我们一般提到JSON对象指的是字典
2.2 Python的字典的格式和JSON格式,稍有不同:
  • 字典中的引号支持单引号和双引号,JSON格式只支持双引号
  • 字典中的True/False首字母大写,JSON格式为true/false
  • 字典中的空值为None, JSON格式为null
2.3 JSON格式操作方法
  • 序列化(字典 -> 文本/文件句柄): json.dumps()/json.dump()
  • 反序列化(文本/文件句柄 -> 字典) : json.loads()/json.load()

3、序列化示例:

# 导入json模块
import json
#  创建字典个数
data = {"name": "张三", "sex": "male", "age": "18"}
# 序列化,转化为合法的JSON文本(方便HTTP传输)
data_str = json.dumps(data)   # json.dumps()支持将json文本格式化输出
# 打印
print(data_str)

 执行结果输出:

C:\Users\yzp\AppData\Local\Programs\Python\Python37\python.exe D:/00test/RFTEST/json_test.py
{"name": "\u5f20\u4e09", "sex": "male", "age": "18"}

Process finished with exit code 0

json.dumps()支持将json文本格式化输出:

 1 import json
 2 import requests
 3 
 4 test_url = "http://openapi.tuling123.com/openapi/api/v2"
 5 test_data = {
 6         "reqType": 0,
 7         "perception": {
 8             "inputText": {
 9                 "text": "你是谁?"
10             }
11         },
12         "userInfo": {
13             "apiKey": "e825286159f9f57db1b5995d72ae2b",
14             "userId": "1234"
15         }
16     }
17 
18 res = requests.post(url=test_url, json=test_data)
19 # 输出一行文本
20 print(res.text)
21 res_dict = res.json()
22 print(json.dumps(res_dict, indent=2, sort_keys=True, ensure_ascii=False))

 执行结果输出:

C:\Users\yzp\AppData\Local\Programs\Python\Python37\python.exe D:/00test/RFTEST/test_json2.py
{"intent":{"code":4003},"results":[{"groupType":0,"resultType":"text","values":{"text":"我是机器人!"}}]}      # res.text,有些接口中文会返回为\u
{
  "intent": {
    "code": 4003
  },
  "results": [
    {
      "groupType": 0,
      "resultType": "text",
      "values": {
        "text": "我是机器人!"  # 树状格式,比较清晰,显示中文
      }
    }
  ]
}

Process finished with exit code 0
  • indent: 缩进空格数,indent=0输出为一行
  • sork_keys=True: 将json结果的key按ascii码排序
  • ensure_ascii=Fasle: 不确保ascii码,如果返回格式为utf-8包含中文,不转化为\u...

4、反序列化示例:

import json

# JSON文本格式的响应信息
test_json = '{"name": "\u5f20\u4e09", "password": "123456", "male": "true", "money": "null"}'
# 转化为字典
test_dict = json.loads(test_json)
print(test_json)
print(type(test_json))
print(test_dict['name'])
print(type(test_dict))

  执行结果输出:

C:\Users\yzp\AppData\Local\Programs\Python\Python37\python.exe D:/00test/RFTEST/json_test.py
{"name": "张三", "password": "123456", "male": "true", "money": "null"}
<class 'str'>
张三
<class 'dict'>

Process finished with exit code 0

5、文件的序列化与反序列化

5.1 序列化:字典 -> 文件句柄
import json

# 字典格式
res_dict = {'name': '张三', 'password': '123456', "male": True, "money": None}
f = open('json_demo.json', 'w')
json.dump(res_dict, f)

查看同级目录,增加了一个json_demo.json文件,内容为:

{"name": "\u5f20\u4e09", "password": "123456", "male": true, "money": null}
5.2 序列化: 文件句柄 -> 字典
在项目中(和下面脚本文件同一路径下)新建demo1.json文件,内容如下,保存:
{
  "name": "张三",
  "sex": "male",
  "age": "18",
  "money": "null"
}

 新建Python文件:

import json

# 文件中有中文需要指定编码
f = open("demo1.json", "r", encoding="utf-8")
# 反序列化将文件句柄转化为字典
f_dict = json.load(f)
# 读取其中参数
print(type(f_dict))
print(f_dict['name'])
f.close()

   执行结果输出:

C:\Users\yzp\AppData\Local\Programs\Python\Python37\python.exe D:/00test/RFTEST/json_test.py
<class 'dict'>
张三

Process finished with exit code 0
5.3 文件使用情况判断
什么时候使用JSON对象(字典)什么时候使用JSON文本? 一般在组装data参数时,建议使用字典格式,发送请求时用json.dumps(data)转化为文本发送,收到请求
后使用json.loads(res.text)转化为字典,方便我们获取其中的参数信息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值