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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:36:34