Python使用json.loads解析JSON字符串时报TypeError无法转为字典
报错原因与修复方法
核心报错逻辑
你存储在check-deps.txt里的每一行内容,存在双层序列化问题,无法直接被解析为字典:
- 可直接解析为字典的原生JSON行格式为:
{"version":"1.4.12","name":"earmark_parser",...} - 你当前文件内的行格式为:
"{\"version\":\"1.4.12\",\"name\":\"earmark_parser\",...}"
当对这类行调用json.loads时,解析器识别到行首、行尾的外层双引号,会把整行内容解析为一个纯字符串,而非字典。后续你用字符串键["version"]对该对象做索引时,就会触发TypeError: string indices must be integers——字符串仅支持整数类型的字符下标,不支持字符串键取值。
另外,通过readlines()读取的每行末尾会自带换行符\n,属于潜在的解析干扰项。
可直接运行的修复代码
import json version_results = [] with open("check-deps.txt", "r") as f: for raw_line in f: # 去除行首尾空白、换行符 trimmed_line = raw_line.strip() # 第一次解析:剥离外层包裹的字符串层,拿到内部的原生JSON文本 inner_json_text = json.loads(trimmed_line) # 第二次解析:把原生JSON文本转换为字典 dep_info = json.loads(inner_json_text) # 提取version字段 ver = dep_info["version"] print(ver) version_results.append(ver)
格式根源
当前文件的双层序列化格式,是写文件阶段的操作误差导致的:本应直接把字典序列化后的JSON文本写入文件,实际操作中先把字典转成了字符串,又把这个字符串本身整体加引号写入文件,最终形成了外层多包一层双引号、内部引号全转义的格式。如果要从源头修正,只需要在最初写入文件时,直接将字典序列化的结果作为单行内容写入,不要额外包裹双引号即可。
内容的提问来源于stack exchange,提问作者Alan Hsieh
相关产品推荐
相关产品推荐

