You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中更新JSON对象值后修改未生效的问题咨询

问题原因
  • 核心问题是你修改的是json.loads()生成的临时对象,没有将修改后的结果回写到session中。每次执行json.loads(session['userBoard'])都会生成一个全新的Python列表对象,你在循环中对这个临时列表的修改不会同步到session里存储的原始JSON字符串,因此读取时自然看不到更新。
  • 循环逻辑存在错误:当前只要遍历到的条目id不匹配就会打印Nothing found!,就算后续存在匹配的条目也会触发无效打印。
  • 如果你打印的是代码中声明的全局变量userBoard,它和session中存储的userBoard是完全独立的两份数据,修改session不会自动同步到全局变量,而且全局变量在Flask多请求场景下是线程不安全的,不建议用来存储单用户数据。
解决方案

确实需要额外做序列化操作,步骤如下:

  1. 先将session中的JSON字符串反序列化为Python对象,存入临时变量
  2. 遍历修改临时变量的对应条目
  3. 将修改后的临时变量重新序列化为JSON字符串,赋值回session['userBoard']

修正后的代码示例:

import json
from flask import request, session

@app.get("/setItem")
def setItem():
    id = request.args.get('itemId')
    id = int(id[2:]) 
    # 1. 反序列化到临时变量
    user_board = json.loads(session['userBoard'])
    found = False
    # 2. 遍历修改
    for item in user_board:
        if item['id'] == id:
            item['solved'] = 'true'
            found = True
            break # 匹配到就可以提前退出循环
    if not found:
        print('Nothing found!')
    # 3. 序列化后回写session
    session['userBoard'] = json.dumps(user_board)
    # 如果你的业务确实需要用到全局变量userBoard,这里同步更新即可(不推荐使用全局变量)
    # global userBoard
    # userBoard = session['userBoard']
    return 'OK'

如果修改后仍不生效,可以在给session赋值后添加session.modified = True强制Flask将session更新持久化。

内容的提问来源于stack exchange,提问作者Patrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:42:01