Python循环生成JSON对象输出为字符串而非预期结构如何解决
错误原因
- 结构预期错误:你预期的JSON结构不合法,同一个对象内重复的
dataset等键会被后写入的内容覆盖,需要按索引访问多条数据应该使用**数组(列表)**结构,而非单个JSON对象。 - 循环赋值逻辑错误:你在循环内每次都将
json_obj覆盖为json.dumps()的返回值,该函数返回的是JSON格式字符串,不是可操作的Python容器对象,且循环结束后只会保留最后一次的序列化结果。 - 二次序列化错误:你后续对已经是字符串的
json_obj再次执行json.dumps(),相当于对字符串做二次序列化,自然会生成带转义符的结果,此时取[0]访问到的就是字符串的首个字符双引号。
修复方案
首先初始化空列表存储所有单条数据,循环内仅将单条结果的字典追加到列表中,所有计算完成后再按需操作:
import json # 初始化列表存储多条结果 json_list = [] for i in range(len(dictionary)): dataset, test = retrieve_data() tp, fp, tn, fn = calculate_score() # 追加单条数据到列表 json_list.append({ "dataset": dataset, "test": test, "results": {"TP": tp, "FP": fp, "FN": fn, "TN": tn} }) # 直接操作Python列表对象即可通过索引访问第一条数据 print(json_list[0]) # 如果需要导出为JSON格式字符串,统一做一次序列化即可 json_str = json.dumps(json_list, indent=4) print(json_str)
最终生成的JSON结构为数组,完全支持通过下标索引访问对应条目:
[ { "dataset": "1", "test": "trial1", "results": { "TP": 5, "FP": 3, "FN": 2, "TN": 5 } }, { "dataset": "2", "test": "trial2", "results": { "TP": 6, "FP": 4, "FN": 12, "TN": 25 } }, { "dataset": "3", "test": "trial3", "results": { "TP": 15, "FP": 1, "FN": 11, "TN": 2 } }, { "dataset": "4", "test": "trial4", "results": { "TP": 5, "FP": 11, "FN": 1, "TN": 21 } } ]
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

