You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:35:16