如何使用 python 更新嵌套 JSON 文件中的值?

Posted

技术标签:

【中文标题】如何使用 python 更新嵌套 JSON 文件中的值?【英文标题】:How to update a value in nested JSON file using python? 【发布时间】:2022-01-19 10:55:09 【问题描述】:

我有一个名为“students.json”的 JSON 文件,如下所示:-


    "students": 
        "1":
            "name": "Ricky",
            "marks": 
                "science": "90",
                "english": "50"
            
        ,
        "2":
            "name": "Brad",
            "marks": 
                "science": "80",
                "english": "75"
            
        
    

我想将 Brad 的英语标记更新为 85。我只有 JSON 文件、标记路径列表和更新标记。

updated_marks = "85"
path_to_marks = ["students", "2", "marks", "english"]

我想做这样的事情,

import json

updated_marks = "85"
path_to_marks = ["students", "2", "marks", "english"]

with open('students.json', 'r+') as f:
    json_data = json.load(f)
    value = json_data

    #TODO: code to update marks
    
    f.seek(0)
    f.write(json.dumps(json_data))
    f.truncate()

【问题讨论】:

看看this 的回答,这几乎就是你想要做的 【参考方案1】:

由于您使用 json.load 通过默认的 conversion table 将文件加载回 Python 对象,因此您应该得到一个字典。

因此,在您的情况下,您应该能够像在字典中一样正常编辑数据:

json_data["students"]["2"]["marks"]["english"] = updated_marks

编辑:

由于您想根据 path_to_english_marks 列表进行调用,您可以执行类似 here from jjp 中提到的操作。

from functools import reduce
from operator import getitem

def set_nested_item(dataDict, mapList, val):
    """Set item in nested dictionary"""
    reduce(getitem, mapList[:-1], dataDict)[mapList[-1]] = val
    return dataDict

key_lst = ["key1", "key2", "key3"]
value = "my_value"
d = "key1": "key2": "key3": "some_value"

d = set_nested_item(d, key_lst, value)

print(d)
# 'key1': 'key2': 'key3': 'my_value'

【讨论】:

列表中的值不是固定的,它们可以更改。例如,我可以收到-[“students”、“3”、“marks”、“science”]。在这种情况下,我必须更新第三个学生的科学分数。 好的,表示您要根据列表path_to_english_marks 操作一个值。如果结构合理,我们暂时搁置一旁。您实际上只需要将列表作为请求的键。【参考方案2】:
def update(json, path, new_value):
    obj_ptr = json
    for key in path:
        if key == path[-1]:
            obj_ptr[key] = new_value
        obj_ptr = obj_ptr[key]

像这样从您的代码中调用它:

update(json_data, path_to_marks, updated_marks)

【讨论】:

【参考方案3】:

直接保存

data['students']['2']['marks']['english'] = marks

【讨论】:

你好,这会设置它,但你可以包括保存部分吗?

以上是关于如何使用 python 更新嵌套 JSON 文件中的值?的主要内容,如果未能解决你的问题,请参考以下文章

在python中更新添加到json(嵌套)。

如何使用平面数据表中的嵌套记录构建 JSON 文件?

如何在python中读取嵌套的json数据值?

如何在 mssql 中更新 JSON 中的嵌套数组

如何使用钩子更新嵌套json对象的状态

如何在熊猫数据框中读取嵌套的 json 文件?