Python中将字符串转换为字典时出现错误,请求技术支持
问题排查与解决方案
咱们先定位转换失败的核心原因,再一步步解决:
常见错误原因
- 误用
eval()而非JSON专用解析器:你字符串里的null是JSON的关键字,但Python里对应的是None,如果用eval(my_string)会直接抛出NameError: name 'null' is not defined,这是最可能触发错误的点。 - 另外,字符串里URL部分的
&是HTML两次转义后的&(&→&→&),虽然这不会导致JSON解析失败,但如果后续需要使用这个URL,会出现链接无法正常访问的问题,这属于额外的清理需求。
解决步骤
步骤1:使用json模块正确解析字符串
Python自带的json模块专门处理JSON格式的字符串,能完美识别null、布尔值等JSON特有语法。代码示例:
import json my_string='{"values": [["searchText", "aaaa bbbb"], ["url", "https://aaa.com/w/Try.do?one=yes&isFate=true&active=2&entry=aaaa+bbbb"], ["ip", "11.22.333.44, 12.12.3.111"], ["userId", "4569874"], ["id", 69875462145], ["sessionId", "25F8D032D8FGJ5ED023F56ZZ.TRYING207"], ["pageNumber", null], ["dateCreated", "2018-03-06 17:23:55"], ["page_id", 771790], ["dateModified", "2018-03-06 17:23:55"], ["device_id", 168]]}' # 解析JSON字符串为Python字典 result_dict = json.loads(my_string) print(result_dict)
执行这段代码就能成功得到字典,其中JSON的null会被自动转换成Python的None。
步骤2:(可选)清理URL中的HTML转义字符
如果需要把URL里的&还原成正常的&,可以用html.unescape()来处理,示例:
import json import html my_string='{"values": [["searchText", "aaaa bbbb"], ["url", "https://aaa.com/w/Try.do?one=yes&isFate=true&active=2&entry=aaaa+bbbb"], ["ip", "11.22.333.44, 12.12.3.111"], ["userId", "4569874"], ["id", 69875462145], ["sessionId", "25F8D032D8FGJ5ED023F56ZZ.TRYING207"], ["pageNumber", null], ["dateCreated", "2018-03-06 17:23:55"], ["page_id", 771790], ["dateModified", "2018-03-06 17:23:55"], ["device_id", 168]]}' result_dict = json.loads(my_string) # 找到URL对应的项并清理转义字符 for item in result_dict["values"]: if item[0] == "url": item[1] = html.unescape(html.unescape(item[1])) # 两次unescape,因为是& break print(result_dict["values"][1][1]) # 输出:https://aaa.com/w/Try.do?one=yes&isFate=true&active=2&entry=aaaa+bbbb
为什么不要用eval()?
eval()会执行字符串里的任意Python代码,不仅不安全(如果字符串来自不可信来源),而且无法兼容JSON和Python的语法差异(比如null vs None,true/false vs True/False),所以处理JSON格式必须用专门的解析器。
内容的提问来源于stack exchange,提问作者kab
相关产品推荐
相关产品推荐

