Python将request请求解析为JSON时报JSONDecodeError错误如何解决
错误原因
你当前收到的请求体不是JSON格式,而是application/x-www-form-urlencoded类型的表单键值对数据,结构为键1=值1&键2=值2的URL参数拼接格式。json.loads()只能解析符合JSON语法规则的字符串(通常以{、[作为首字符),传入表单格式的字符串自然会触发首字符不符合预期的JSON解析错误。
解决方案
你可以根据实际场景二选一:
方案1:后端适配现有传参格式,直接解析表单数据
如果不需要修改前端传参逻辑,直接用表单解析工具处理请求体即可:
- 如果是Django框架,框架已经自动封装了表单参数解析,直接调用
request.POST即可获取参数:
import json def checkifaddtocelery(request): # 将表单参数转为字典,再序列化为JSON字符串 body_dict = request.POST.dict() print(body_dict) conid = json.dumps(body_dict) print(conid)
- 如果是其他Python Web框架,用urllib内置的解析方法处理:
import json from urllib.parse import parse_qs def checkifaddtocelery(request): body_unicode = request.body.decode('utf-8') # 解析表单格式字符串,处理为键值对字典 body_qs = parse_qs(body_unicode) # parse_qs默认值为列表,取第一个元素转为普通字典 body_dict = {k: v[0] for k, v in body_qs.items()} print(body_dict) conid = json.dumps(body_dict) print(conid)
方案2:修改前端传参逻辑,发送标准JSON格式数据
要求前端发送请求时,将请求头Content-Type设置为application/json,并且请求体内容为标准JSON字符串而非表单拼接格式,修改后你原有json.loads的解析逻辑即可正常运行。
内容的提问来源于stack exchange,提问作者Jonathan Prieto
相关产品推荐
相关产品推荐

