Python中json.loads返回字符串无法转列表追加字典问题
JSON替换变量后追加字典报错解决方案
核心需求
- 读取JSON文件内容,替换其中指定占位符变量后,向解析后的数据中追加新的字典元素
问题复现
初始仅做变量替换的代码可正常运行:
liststr = [{"type": "divider"},{"type": "section","text": {"type": "mrkdwn","text": "Olá {user} :wave:\n\n Segue abaixo a listagem de colaboradores terceiro sob sua gestão e a data de expiração da conta. \n\nA data de expiração máxima para a conta é de 30 dias. Caso o período de renovação exceda esse limite, a data será fixada em D+30. "}}] liststr = str(liststr) liststr = liststr.replace("{user}", "Bruno") listlist = json.loads(json.dumps(liststr)) print(listlist)
追加新字典时出现报错,对应代码:
liststr = [{"type": "divider"},{"type": "section","text": {"type": "mrkdwn","text": "Olá {user} :wave:\n\n Segue abaixo a listagem de colaboradores terceiro sob sua gestão e a data de expiração da conta. \n\nA data de expiração máxima para a conta é de 30 dias. Caso o período de renovação exceda esse limite, a data será fixada em D+30. "}}] liststr = str(liststr) liststr = liststr.replace("{user}", "Bruno") listlist = json.loads(json.dumps(liststr)) listlist.append({ "user": "bruno" }) print(listlist)
报错信息:
AttributeError: 'str' object has no attribute 'append'
错误原因
- 代码中先通过
str()将Python列表对象转为普通字符串,再执行json.dumps()时,会把这个普通字符串序列化为带转义的JSON字符串,最终json.loads()解析后得到的结果依然是字符串类型,不是列表,自然不存在列表的append()方法。 - 额外注意:直接对Python对象转字符串的结果做文本替换,一旦替换内容包含引号、特殊转义字符,很容易导致后续JSON解析失败,该写法稳定性极差。
正确实现方案
方案1:读取文件原始字符串替换后再解析
如果是直接从.json文件读取内容,文件读取结果本身就是字符串,直接在字符串层面替换占位符后解析为Python列表,即可正常执行追加操作:
import json # 模拟从json文件读取的原始内容,实际使用时用open方法读文件即可 # 例:with open("data.json", "r", encoding="utf-8") as f: raw_json_str = f.read() raw_json_str = ''' [ {"type": "divider"}, { "type": "section", "text": { "type": "mrkdwn", "text": "Olá {user} :wave:\\n\\n Segue abaixo a listagem de colaboradores terceiro sob sua gestão e a data de expiração da conta. \\n\\nA data de expiração máxima para a conta é de 30 dias. Caso o período de renovação exceda esse limite, a data será fixada em D+30. " } } ] ''' # 替换占位符 processed_str = raw_json_str.replace("{user}", "Bruno") # 解析为Python列表 data_list = json.loads(processed_str) # 追加新字典 data_list.append({"user": "bruno"}) print(data_list)
方案2:已加载为Python对象时直接修改字段
如果数据已经被加载为Python列表/字典结构,不需要转字符串做替换,直接定位到对应字段修改值即可,稳定性更高:
import json # 已加载完成的Python列表结构 data_list = [ {"type": "divider"}, { "type": "section", "text": { "type": "mrkdwn", "text": "Olá {user} :wave:\n\n Segue abaixo a listagem de colaboradores terceiro sob sua gestão e a data de expiração da conta. \n\nA data de expiração máxima para a conta é de 30 dias. Caso o período de renovação exceda esse limite, a data será fixada em D+30. " } } ] # 定位到需要替换的文本字段直接修改 data_list[1]["text"]["text"] = data_list[1]["text"]["text"].replace("{user}", "Bruno") # 追加新字典 data_list.append({"user": "bruno"}) print(data_list)
内容的提问来源于stack exchange,提问作者Bruno Souza
相关产品推荐
相关产品推荐

