JSON文件字典更新问题:如何在目标字典下新增子结构而非独立字典
JSON更新问题:无法在指定字典下添加子字典,反而生成独立字典
问题现象
执行函数前的JSON数据:
{ "account_details": [ { "Username": "TestingUsername", "Password": "232Pass", "Email": "TestingEmail@outlook.com", "Token": "18973871HIA" } ] }
执行函数后的错误结果(生成两个独立JSON对象):
{ "account_details": [ { "Username": "TestingUsername", "Password": "232Pass", "Email": "TestingEmail@outlook.com", "Token": "18973871HIA" } ] }{ "Username": "TestingUsername", "Password": "232Pass", "Email": "TestingEmail@outlook.com", "Token": "18973871HIA", "Details": { "Preset1": { "Username": "TestingUsername", "Password": "TestingPassword3", "URL": "TestingURL.com:" } } }
需求说明
在account_details列表中,找到指定Username的用户字典,在其下添加Details子字典,Details中包含指定Preset名称及对应的Username、Password、URL信息,预期结果示例:
{ "account_details": [ { "Username": "ComputingCourse32", "Password": "NoNUmbers", "Email": "computingcw@cwl.com", "Token": "4L8PWWRFYL", "Testing": "Testing", "Details": { "Preset1": { "Username": "Username1", "Password": "Password1", "URL": "http://testing.cwl.com" } } } ] }
尝试过的两种方法
方法1:转为列表后append
with open("testaccount.json", "r+") as file: data = json.load(file) for record in data["account_details"]: if record["Username"] == username: if type(record) is dict: data = [record] data.append ({ "Details" : { "Preset1":{ "Username": "TestingUsername", "Password": "TestingPassword", "URL": "TestingURL.com" } } }) print(data)
方法2:使用update()函数
with open("testaccount.json", "r+") as file: data = json.load(file) for record in data["account_details"]: if record["Username"] == "TestingUsername": new_data = {"Details":{ "Preset1":{ "Username": "TestingUsername", "Password": "TestingPassword3", "URL": "TestingURL.com:" } }} record.update(new_data) print(record)
问题原因分析
方法1错误点:
- 重新赋值
data = [record]破坏了原有JSON结构,把整个数据替换成仅包含目标用户的列表,后续append的字典会变成列表的第二个元素,完全脱离了account_details的层级。 - 没有将修改后的数据写回文件,即使逻辑正确也无法生效。
- 重新赋值
方法2错误点:
- 逻辑上
record.update(new_data)是正确的,但使用r+模式打开文件时,直接写入会追加在原有内容末尾,而不是覆盖,导致文件中同时存在原始JSON和修改后的片段,形成两个独立的JSON对象。
- 逻辑上
正确解决方案
采用“先读取修改,再重新写入覆盖”的方式,确保修改后的完整结构替换原有文件内容:
import json username_target = "TestingUsername" new_details = { "Details": { "Preset1": { "Username": "TestingUsername", "Password": "TestingPassword3", "URL": "TestingURL.com:" } } } # 读取文件并修改数据 with open("testaccount.json", "r") as file: data = json.load(file) for record in data["account_details"]: if record["Username"] == username_target: record.update(new_details) break # 找到目标后退出循环,避免重复修改 # 写入修改后的数据,覆盖原有文件 with open("testaccount.json", "w") as file: json.dump(data, file, indent=4)
关键说明
- 分两次打开文件:第一次只读模式读取数据,第二次写入模式覆盖原有内容,避免
r+模式下的追加问题。 - 修改时直接操作
account_details列表中的目标字典,通过update()方法添加Details子字典,保持原有结构层级。 - 使用
indent=4让生成的JSON格式更易读。
内容的提问来源于stack exchange,提问作者Trqzy
相关产品推荐
相关产品推荐

