Python中如何解析同时包含JSON对象与JSON字符串的同一JSON对象
报错根因
两个报错分别对应两个独立问题:
AttributeError: 'str' object has no attribute 'read':json.load()仅支持接收可读文件流对象作为入参,解析JSON格式字符串必须使用json.loads()。JSONDecodeError: Expecting ',' delimiter:你持有的原始内容不符合JSON语法规范:一是JSON标准强制要求字符串使用双引号包裹,你给出的内容外层字典使用了单引号;二是key2对应的嵌套JSON字符串未做转义,内部双引号和外层结构的引号边界冲突,导致解析器无法正确识别语法分段。
可行解析方案
不需要手动做字符串替换,按两步处理即可:
- 外层非标准类字典结构,使用Python标准库
ast.literal_eval()做转换,该方法可以安全解析单引号包裹的Python原生字典结构,无代码注入风险。 - 对转换得到的字典做递归遍历,所有值如果是合法JSON格式的字符串,就继续用
json.loads()解析,直到没有可解析的嵌套JSON为止。
可直接运行的参考代码:
import json import ast # 待解析的原始内容 raw_content = "{'key1': 'val1', 'key2': \"{\"key3\": [\"val3\"]}\"}" # 第一步:转换外层类字典字符串为Python字典 parsed_dict = ast.literal_eval(raw_content) # 第二步:递归解析所有嵌套的JSON字符串 def parse_nested_json(obj): if isinstance(obj, str): try: # 尝试将字符串解析为JSON,解析失败则返回原字符串 return parse_nested_json(json.loads(obj)) except (json.JSONDecodeError, ValueError): return obj elif isinstance(obj, dict): return {k: parse_nested_json(v) for k, v in obj.items()} elif isinstance(obj, list): return [parse_nested_json(item) for item in obj] else: return obj final_result = parse_nested_json(parsed_dict) print(final_result) # 输出:{'key1': 'val1', 'key2': {'key3': ['val3']}}
提示:如果嵌套JSON字符串来自接口返回、日志输出等场景,优先排查上游输出逻辑是否遗漏了字符串转义步骤,源头修正格式可以大幅降低后续解析的复杂度。
内容的提问来源于stack exchange,提问作者Terence Yang
相关产品推荐
相关产品推荐

