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

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. 方法1错误点:

    • 重新赋值data = [record]破坏了原有JSON结构,把整个数据替换成仅包含目标用户的列表,后续append的字典会变成列表的第二个元素,完全脱离了account_details的层级。
    • 没有将修改后的数据写回文件,即使逻辑正确也无法生效。
  2. 方法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:21:49