【发布时间】: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,而且真的很长而且很复杂;
我尝试使用可选参数deep、name2 和name3 来执行此操作,并使用if elif 执行此操作以执行if deep == 2: return loadedf[name][name2]。
这里使用的代码可能已经过时了,或者部分无法正常工作,因为我是全新编写的,因为我重写了几次以达到我的目标;通常能够使用 JSON 文件完成所有这些操作。
【问题讨论】:
-
如果您面临的问题范围仅限于更新
json.load返回的字典,那么这可能是this question 的副本。 -
在几个案例中对其进行了测试,并为我的不和谐机器人“预发布”了它,结果是现在发生了一些我什至无法解释的事情,我仍然无法在不删除的情况下更新一个值字典中的其他值
-
一般情况下,您应该只使用 JSON 作为 I/O 格式。否则,您应该将对象转换为用户定义类的实例(如果您有模式,这很容易做到)。
标签: python json python-3.x dictionary