【问题标题】:Editing value in dict with nested dict while being able to still update without nested使用嵌套字典编辑字典中的值,同时仍然能够在没有嵌套的情况下更新
【发布时间】:2022-01-23 17:43:41
【问题描述】:

问题

我有一些构建不同的 JSON 文件,我需要一个代码来编辑字典中的值,这些字典只是一个字典和其他嵌套字典而不删除其他值的字典。

示例

所以我得到了一个 JSON 文件,例如:

JSON/id_list.json

{"whatever": [ID_1, ID_2, ID_3]}

JSON/main_id.json

{"value": "yes"}

或其他类似的

JSON/id_data.json

{"data": {"ID_1": {"type1": 0, "type2": 1}, "ID_2": {"type1": 0, "type2": 0}}}

当前代码

我当前的代码只能编辑第一个和/或第二个,所以我希望它是通用的,但似乎没有找到答案

Functions/get_json.py

def get(name: str, path: str, load: bool):
    if load:
        _load(path)
    return loadedf[name]

def update(name: str, text, path: str, load: bool):
    if load:
        _load(path)
    loadedf[name].remove(get(name, path, False))
    loadedf[name].append(text)

    with open(path, "w+"):
        json.dump(loadedf, nfl)

def _load(path: str):
    preloadf = open(path, 'r')
    global loadedf
    loadedf = json.load(preloadf)

game.py

from Functions import get_json.py
async def random_function():
    get_json.get('whatever', '/JSON/id_list.json', True)
    get_json.update('value', 'no', '/JSON/main_id.json', True)

新代码理念

game_new.py

from Functions import get_json.py
async def random_function():
    get_json.get(['whatever'], '/JSON/id_list.json', True)
    get_json.get(['data', 'ID_1', 'type2'], '/JSON/id_data.json', True)
    get_json.update(['data', 'ID_2', 'type1'], '/JSON/id_data.json', False)

但我不知道如何去做或实现这一点。

到目前为止我尝试了什么

我试过dict.update(),用for循环来做

prev = loadedf
for i in name:
    prev = prev[i]

    prev.remove(get(name, path, False)[0])

或者用一些奇怪的东西,比如__setattr()__,用一种我不满意的方式,因为它通常不能处理 JSON,而且真的很长而且很复杂;

我尝试使用可选参数deepname2name3 来执行此操作,并使用if elif 执行此操作以执行if deep == 2: return loadedf[name][name2]


这里使用的代码可能已经过时了,或者部分无法正常工作,因为我是全新编写的,因为我重写了几次以达到我的目标;通常能够使用 JSON 文件完成所有这些操作。

【问题讨论】:

  • 如果您面临的问题范围仅限于更新json.load 返回的字典,那么这可能是this question 的副本。
  • 在几个案例中对其进行了测试,并为我的不和谐机器人“预发布”了它,结果是现在发生了一些我什至无法解释的事情,我仍然无法在不删除的情况下更新一个值字典中的其他值
  • 一般情况下,您应该只使用 JSON 作为 I/O 格式。否则,您应该将对象转换为用户定义类的实例(如果您有模式,这很容易做到)。

标签: python json python-3.x dictionary


【解决方案1】:

昨天晚上有了一个想法并内置了它以获取此工作代码

def edit_json(name: list, text, path: str, load: bool, execute: str):
    try:
        if load:
            _load(path)

        prev = "loadedf"
        for entry in name:
            if isinstance(entry, int):
                prev += f"[{entry}]"
            else:
                prev += f"[\"{entry}\"]"

        if execute == "add" or execute == "append":
            exec(prev + ".append(text)")
        elif execute == "remove":
            exec(prev + ".remove(text)")
        elif execute == "update":
            exec(prev + " = text")

        with open(path, "w+") as nfl:
            json.dump(loadedf, nfl)

所以这也是我现在的解决方案,也是将name 作为内置数组的想法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2022-01-25
    • 2019-12-04
    • 1970-01-01
    • 2018-01-29
    相关资源
    最近更新 更多