首页 > 解决方案 > 在python中更新json对象中的值

问题描述

我正在努力更新 json 对象中的值。

import json

userBoard = '' #see example below. is loaded in a separate function
@app.get("/setItem")
def setItem():
id = request.args.get('itemId')
id = int(id[2:]) # is for instance 2

for item in json.loads(session['userBoard']):
    if item['id'] == id:
        item['solved']='true'
    else:
        print('Nothing found!')        
return('OK')

json 示例:

[{"id": 1, "name": "t1", "solved": "false"}, {"id": 2, "name": "t2", "solved": "false"}, {"id": 3, "name": "t3"}]

但是,当我检查 userBoard 的打印输出时,该值仍然是“假”。有人有什么主意吗?这需要以某种方式序列化吗?尝试了很多东西,但没有成功...

非常感谢!

标签: pythonjson

解决方案


可以说这个问题在某种程度上是具体的,并且缺乏一些信息来提供简单的答案。因此,我将做出一些假设并提出解决方案。

首先,id并且input是 python 内置的,不应该用作变量名。我将故意使用这些带有_前缀的字符串,以便您仍然可以以更安全的方式使用这些名称。

import json
from typing import List

json_ex = '[{"id": 1, "name": "t1", "solved": "false"}, {"id": 2, "name": "t2", "solved": "false"}, {"id": 3, "name": "t3"}]'
_id = 2  # for now a constant for demonstration purposes

def setItem(_input: List[dict]):    
    for item in _input:
        if (this_id := item['id']) == _id:  # requires python 3.8+, otherwise you can simplify this
            item['solved'] = 'true'
            print(f'Updated item id {this_id}')
        else:
            print('Nothing found!')

json_ex_parsed = json.loads(json_ex)  # this is now a list of dictionaries
setItem(json_ex_parsed)

Output:
Nothing found!
Updated item id 2
Nothing found!

json_ex_parsed申请前的内容setItem

[{'id': 1, 'name': 't1', 'solved': 'false'},
 {'id': 2, 'name': 't2', 'solved': 'false'},
 {'id': 3, 'name': 't3'}]

之后:

[{'id': 1, 'name': 't1', 'solved': 'false'},
 {'id': 2, 'name': 't2', 'solved': 'true'},  # note here has been updated
 {'id': 3, 'name': 't3'}]

推荐阅读