重命名 python 中递增的 JSON 个对象

Rename incrementing JSON objects in python

我有一个 JSON 文件,如下所示:

"153689763780624385": {
    "1": {
        "author": "Mike",
        "date": "05/06/2022, 12:00:57"

    },
    "2": {
        "author": "Mike",
        "date": "05/06/2022, 13:29:43"

    },
    "3": {
        "author": "Jan01p",
        "date": "05/7/2022, 16:01:22"
    }
}

我正在做的是访问我的 JSON,并删除 json 文件中的第二个对象键。使用以下代码。

with open("pins.json", "r+") as f:
    p = json.load(f)
gid = "153689763780624385"
del p[gid]["2"]
with open("pins.json", "w+") as fp:
     json.dump(p, fp, indent=4)

现在我的 JSON 看起来像这样

"153689763780624385": {
    "1": {
        "author": "Mike",
        "date": "05/06/2022, 12:00:57"

    }
    "3": {
        "author": "Jan01p",
        "date": "05/7/2022, 16:01:22"
    }
}

我的目标是使用某种循环来按顺序重命名以下所有键。所以把3改成2。将 4 命名为 3 等等。 JSON 大得多,只是为了询问目的而缩短了它。将键重命名为按递增顺序排列的好方法是什么?到目前为止,我正在考虑 for 循环中的 dict.pop 。但是想不通。

假设你的键都是字符串形式的数字,你只想让它们休息 1. 使用 dict.pop() 方法:

value_to_remove = 2

with open("pins.json", "r+") as f:
    p = json.load(f)
gid = "153689763780624385"

del p[gid][str(value_to_remove)]

for key, values in p[gid].items():
    if int(key) > value_to_remove:
        p[gid][str(int(key)-1)] = p[gid].pop(str(key))

with open("pins.json", "w+") as fp:
     json.dump(p, fp, indent=4)

如果保存在 gid 中的键值是您想要删除的唯一键值,则 "2" 键。然后就可以了。如果你想为每个 'first key' 实现这个,你可以迭代 json 字典中的每个第一个键。

您可以使用以下逻辑对所有键重新排序。

my_dict1 = {"1": "a", "3": "b", "4": "c", "5": "d"}
my_dict2 = {str(i+1):v for i, v in enumerate(my_dict1.values())}

print(my_dict2)
# {'1': 'a', '2': 'b', '3': 'c', '4': 'd'}

此解决方案只能用于 Python 3.7 及更新版本,因为此版本之前的词典是无序的。 如果您想按日期排序。