如何删除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
相关产品推荐
相关产品推荐

