如何移除JSON返回结果中的反斜杠\转义字符
数据库查询接口返回JSON带多余反斜杠解决方案
问题复现
当前编写的数据库查询接口代码如下:
cursor = connection.cursor() cursor.execute('SELECT patientFirstName, patientLastName FROM `patientmaster` WHERE nik = "1"') patientProfile = cursor.fetchall() patientProfileArray = [] patientName = None for row in patientProfile: patientFirstName = row[0] patientLastName = row[1] patientProfile = {'Patient': [{'patientFirstName': patientFirstName, 'patientLastName': patientLastName}]} responseObject = {} responseObject['statusCode'] = 200 responseObject['headers'] = {} responseObject['body'] = json.dumps(patientProfile, default=str) return responseObject
接口实际返回结果带多余转义反斜杠:
{\"Patient\": [{\"patientFirstName\": \"vin\", \"patientLastName\": \"wan\"}]}
根因分析
- 核心问题是JSON重复序列化:手动调用
json.dumps()将字典转为JSON字符串后,接口运行环境(如Serverless函数平台、部分Web框架)会自动对整个返回对象再次做JSON序列化,字符串内的双引号就会被加上转义反斜杠。 - 现有代码还存在逻辑漏洞:遍历查询结果集时每次循环都会覆盖姓名字段变量,最终只会保留最后一条查询记录,前面的结果会全部丢失。
修复方法
根据部署场景二选一即可:
- Serverless类自动序列化环境(如Lambda、云函数):不需要手动序列化JSON,直接传入字典对象,同时补全遍历逻辑和响应头:
cursor = connection.cursor() cursor.execute('SELECT patientFirstName, patientLastName FROM `patientmaster` WHERE nik = "1"') patient_rows = cursor.fetchall() patient_list = [] for row in patient_rows: patient_list.append({ "patientFirstName": row[0], "patientLastName": row[1] }) responseObject = { "statusCode": 200, "headers": {"Content-Type": "application/json"}, "body": {"Patient": patient_list} } return responseObject
- 原生Web框架(如Flask、Django)手动序列化场景:保留
json.dumps()逻辑,但禁止对最终返回的responseObject整体再次做序列化,同时补全正确的Content-Type响应头:
import json cursor = connection.cursor() cursor.execute('SELECT patientFirstName, patientLastName FROM `patientmaster` WHERE nik = "1"') patient_rows = cursor.fetchall() patient_list = [] for row in patient_rows: patient_list.append({ "patientFirstName": row[0], "patientLastName": row[1] }) responseObject = { "statusCode": 200, "headers": {"Content-Type": "application/json"}, "body": json.dumps({"Patient": patient_list}, default=str) } return responseObject
修复后即可得到标准无转义的JSON返回结果:
{"Patient": [{"patientFirstName": "vin", "patientLastName": "wan"}]}
内容的提问来源于stack exchange,提问作者Kevin Irawan
相关产品推荐
相关产品推荐

