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

如何删除JSON中的对象?调用pop方法报'str对象无pop属性'错误怎么解决

报错原因
  • dataRead['Teachers'][3]['Name']获取到的是字符串类型的教师姓名,pop()是字典/列表专属方法,不能作用在字符串上,所以触发属性错误
  • 你的代码逻辑错误:不需要先弹出属性再追加新值,直接覆盖字典对应键的值即可完成替换
  • 额外错误:json.dump()没有返回值,执行dataRead = json.dump(dataRead,rf)会把dataRead设为None,属于冗余错误写法
正确实现代码

方案1:直接覆盖替换(最简写法,不需要先删除属性)

import json

with open('dict.json', 'r', encoding='utf-8') as rf:
    dataRead = json.load(rf)

log = input("Your username: ")
pas = input("Your password: ")

# 校验管理员权限
for admin in dataRead['Admins']:
    if log == admin['Admin_name'] and pas == admin['Admin_pass']:
        # 直接修改第4位教师(索引3)的Name属性值为新内容
        dataRead['Teachers'][3]['Name'] = "Hello"
        # 写入文件不需要给dataRead赋值
        with open('dict.json', 'w', encoding='utf-8') as wf:
            json.dump(dataRead, wf, indent=4, ensure_ascii=False)
        break

方案2:先删除属性再赋值(符合你原本先删再加的需求)

如果你确实需要先删除原Name属性再添加新值,可以用字典的pop方法操作教师对象本身,而不是操作Name属性的值:

import json

with open('dict.json', 'r', encoding='utf-8') as rf:
    dataRead = json.load(rf)

log = input("Your username: ")
pas = input("Your password: ")

for admin in dataRead['Admins']:
    if log == admin['Admin_name'] and pas == admin['Admin_pass']:
        # 对教师字典对象操作,弹出Name属性
        dataRead['Teachers'][3].pop('Name')
        # 重新赋值Name属性
        dataRead['Teachers'][3]['Name'] = "Hello"
        with open('dict.json', 'w', encoding='utf-8') as wf:
            json.dump(dataRead, wf, indent=4, ensure_ascii=False)
        break
补充说明

如果你的需求不是固定修改索引为3的教师,而是修改指定姓名的教师,可以增加遍历逻辑匹配目标教师:

# 例如要把姓名为"Mag"的教师Name改为"Hello"
for teacher in dataRead['Teachers']:
    if teacher['Name'] == 'Mag':
        teacher['Name'] = 'Hello'

另外你贴出的JSON结构示例存在语法错误(多余的闭合括号、逗号),实际使用时请保证JSON文件格式合法,否则json.load会直接报错。


内容的提问来源于stack exchange,提问作者Ayrini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:57:02