为何Python生成的JSON为字符串格式、含转义换行符?如何解决
问题根源
当前生成的JSON结构异常,核心原因是把API返回的纯文本格式响应当成普通字符串直接追加到了数据数组中。json.dump在序列化普通字符串时,会自动给字符串包裹外层双引号,同时把字符串内部的双引号、换行/回车符做转义处理,这就是你看到大括号被外层双引号包裹、文件内满是\n/\r转义符的根本原因。
修复方案
- 禁止直接使用
requests返回的.text属性值追加到数据数组。这是未经解析的纯文本内容,直接传入会被当做普通字符串处理。 - 拿到API响应后,先把JSON格式的响应体解析成Python原生的字典/列表对象,再追加到数组中:
- 优先使用requests内置的
.json()方法,一步完成JSON文本到Python对象的转换 - 若接口响应头配置异常导致
.json()方法失效,可手动调用json.loads(result_detail.text)完成解析
- 优先使用requests内置的
- 移除循环内部的
write_json(data)调用。原有代码每处理一个项目就重写一次文件,既降低IO效率,还可能因中途程序异常导致文件写入不完整。等所有项目数据处理完成后,再统一执行一次文件写入即可。 - 增加API响应状态校验,避免接口报错时把错误页面的内容写入最终JSON文件。
修改后的参考代码
def write_json(data, filename='data.json'): with open(filename, 'w', encoding='utf-8') as wf: json.dump(data, wf, ensure_ascii=False, indent=4) # 读取存储项目ID的本地JSON with open('sast-projects.json', 'r', encoding='utf-8') as f: projects = json.load(f) # 读取基础数据文件 with open('data.json', 'r', encoding='utf-8') as json_file: data = json.load(json_file) temp = data['data'] for project in projects: result_detail = requests.get( url_detail + str(project['id']), headers=header_detail ) # 仅在请求成功时做解析 if result_detail.status_code == 200: # 解析为Python原生对象,而非纯文本 parsed_detail = result_detail.json() temp.append(parsed_detail) # 全量数据处理完成后再统一写入文件 write_json(data)
效果说明
修改后生成的JSON文件中,每个从API获取的项目详情会以标准嵌套对象的形式存在于data数组中,不会再出现外层包裹双引号、满是转义换行符的异常结构。
若运行中
.json()方法抛出解析错误,可先打印对应请求的result_detail.text内容,确认接口返回的是否为合规JSON格式。
内容的提问来源于stack exchange,提问作者Snackys
相关产品推荐
相关产品推荐

