You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何解析同时包含JSON对象与JSON字符串的同一JSON对象

报错根因

两个报错分别对应两个独立问题:

  • AttributeError: 'str' object has no attribute 'read':json.load()仅支持接收可读文件流对象作为入参,解析JSON格式字符串必须使用json.loads()。
  • JSONDecodeError: Expecting ',' delimiter:你持有的原始内容不符合JSON语法规范:一是JSON标准强制要求字符串使用双引号包裹,你给出的内容外层字典使用了单引号;二是key2对应的嵌套JSON字符串未做转义,内部双引号和外层结构的引号边界冲突,导致解析器无法正确识别语法分段。
可行解析方案

不需要手动做字符串替换,按两步处理即可:

  1. 外层非标准类字典结构,使用Python标准库ast.literal_eval()做转换,该方法可以安全解析单引号包裹的Python原生字典结构,无代码注入风险。
  2. 对转换得到的字典做递归遍历,所有值如果是合法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:42:25