Python CGI脚本JSON解析ValueError求助:期望属性名错误
解决Python CGI脚本解析JSON时的ValueError问题
我之前在处理CGI脚本接收JSON的时候也踩过类似的坑,虽然你说在线验证过JSON是合法的,但这个报错大概率不是JSON本身的问题,而是数据在CGI传输或接收环节出了问题。给你几个具体的排查和解决方向:
1. 先确认你实际接收到的数据是什么样的
这是最关键的一步!很多时候我们以为收到的是完整合法的JSON,但实际上可能是截断、转义错误或者被包裹了额外内容的字符串。你可以在脚本里先把接收到的原始数据打印出来(比如输出到日志或者直接返回给前端):
import sys import os # 读取POST数据 content_length = int(os.environ.get('CONTENT_LENGTH', 0)) raw_data = sys.stdin.read(content_length) # 打印原始数据(方便排查) print("Content-Type: text/plain") print() print("Received raw data:", repr(raw_data))
运行后看看输出的raw_data是不是和你发送的JSON完全一致——比如有没有多了引号、转义符,或者被截断了?如果不一致,那问题就出在数据传输或接收的环节。
2. 检查CGI数据接收的方式是否正确
CGI中处理POST数据的常见误区:
- 没有根据
CONTENT_LENGTH读取数据:如果直接用sys.stdin.read(),在某些服务器环境下可能会读取到多余的空字符或者不完整的内容,导致JSON解析失败。一定要根据环境变量里的CONTENT_LENGTH来读取对应长度的数据,就像上面代码里那样。 - 混淆了GET和POST参数:如果你是用POST发送JSON,但脚本里错误地去读取
QUERY_STRING(GET参数),那自然会解析失败。 - 前端发送的不是纯JSON:比如前端把JSON放在了表单字段里(比如
json={"key":"value"}),这时候你需要先解析表单,再取出对应的字段值去解析JSON:import cgi form = cgi.FieldStorage() json_data = form.getvalue('json') # 再用json.loads(json_data)解析
3. 检查编码和转义问题
即使原始JSON合法,传输过程中可能因为编码问题导致乱码,或者被自动转义:
- 确保脚本的编码是UTF-8:在脚本开头加上
# -*- coding: utf-8 -*-,并且读取数据时明确指定编码(Python 3中sys.stdin默认编码可能不是UTF-8):sys.stdin = open(sys.stdin.fileno(), mode='r', encoding='utf-8', closefd=False) - 检查前端发送的Content-Type是否正确:前端应该设置
Content-Type: application/json,如果设置成了application/x-www-form-urlencoded,服务器可能会对JSON做URL编码,导致你收到的是类似%7B%22key%22%3A%22value%22%7D这样的字符串,这时候需要先URL解码再解析JSON。
4. 测试最小化的解析场景
如果上面的排查都没问题,可以写一个最小化的测试脚本,直接用合法的JSON字符串硬编码进去,看看能不能正常解析:
import json test_json = '{"name": "test", "value": 123}' try: data = json.loads(test_json) print("Success:", data) except ValueError as e: print("Error:", e)
如果这个测试能成功,说明问题肯定出在数据接收环节,而不是JSON解析的代码逻辑。
内容的提问来源于stack exchange,提问作者catdude
相关产品推荐
相关产品推荐

