Locust中如何处理JSON数组响应的解析错误?(FastHTTPUser/requests)
解决Locust中POST请求响应JSON解析失败的问题
错误原因分析
你提供的API响应格式 [{"id":22,"name":tom,"age":10}] 是无效JSON——字符串类型的tom没有用双引号包裹,这违反了JSON的语法规范。Postman可能做了兼容处理,但Python的JSON解析器(包括Locust依赖的解析器)会严格校验语法,因此调用resp.json()时会报错。
方案一:修复API响应(优先推荐)
先联系后端开发,将响应修正为标准JSON格式:
[{"id":22,"name":"tom","age":10}]
修正后即可正常使用resp.json()解析,以下是两种库的实现示例:
1. 使用Locust的FastHTTPUser
from locust import FastHTTPUser, task class APITestUser(FastHTTPUser): @task def send_post_request(self): # 替换为你的实际请求体 request_payload = {"key1": "value1", "key2": "value2"} # 发送POST请求 response = self.client.post("/target-endpoint", json=request_payload) # 解析JSON响应 try: response_data = response.json() # 示例:提取并打印name字段 print(f"用户名称: {response_data[0]['name']}") except Exception as err: print(f"JSON解析失败: {str(err)}, 原始响应内容: {response.text}")
2. 使用requests库(Locust中可混用)
import requests def test_post_api(): request_payload = {"key1": "value1", "key2": "value2"} response = requests.post("http://your-api-domain/target-endpoint", json=request_payload) try: response_data = response.json() print(f"用户年龄: {response_data[0]['age']}") except Exception as err: print(f"JSON解析失败: {str(err)}, 原始响应内容: {response.text}")
方案二:临时修复非标准响应(API无法修改时)
如果后端暂时无法调整响应格式,可以通过正则表达式手动修复无效JSON后再解析:
1. FastHTTPUser下的处理
from locust import FastHTTPUser, task import json import re class APITestUser(FastHTTPUser): @task def send_post_request(self): request_payload = {"key1": "value1", "key2": "value2"} response = self.client.post("/target-endpoint", json=request_payload) # 正则修复未加引号的字符串值 fixed_response = re.sub(r'(\w+):(\w+)(?=[,\}\]])', r'\1:"\2"', response.text) try: response_data = json.loads(fixed_response) print(f"用户ID: {response_data[0]['id']}") except Exception as err: print(f"修复后仍解析失败: {str(err)}, 原始响应: {response.text}")
2. requests库下的处理
import requests import json import re def test_post_api(): request_payload = {"key1": "value1", "key2": "value2"} response = requests.post("http://your-api-domain/target-endpoint", json=request_payload) fixed_response = re.sub(r'(\w+):(\w+)(?=[,\}\]])', r'\1:"\2"', response.text) try: response_data = json.loads(fixed_response) print(f"用户ID: {response_data[0]['id']}") except Exception as err: print(f"修复后仍解析失败: {str(err)}, 原始响应: {response.text}")
注意:正则修复仅为临时 workaround,无法覆盖所有非标准JSON场景(如含特殊字符的字符串),长期来看仍需后端输出标准JSON。
内容的提问来源于stack exchange,提问作者Prasanna S US
相关产品推荐
相关产品推荐

