python中修改局部json的思路

news/2025/10/13 20:04:30/文章来源:https://www.cnblogs.com/oldsaltfish/p/19139245

背景

希望修改某个路径下的字段,但是不希望覆盖其他字段。

{"name": "张三","age": 18
}

类似于上下对比这样。

{"name": "张三","age": 21
}

方案

get - set

使用get获取整个对象,然后修改整个对象后使用set。

回调函数

def callback(obj):obj['age'] = 21return obj

隔应的地方有两点:

  1. python的匿名函数只能有一条表达式,因此即使是上面这种简单的语句也得写一个具名函数,非常啰嗦。
  2. 事实上在执行obj['age'] = 21的时候值的修改已经完成(对象的话),但是考虑到还有字符串等简单数值,因此还是有返回值,并且内部有赋值操作。因此如果是对象的话,会有一次无效的赋值。(类似于obj=obj)

总的来说,完全没有简洁性可言。

pydash

image
比较完美地解决了问题,但是我不希望这种小问题都引入一个库。

自设计路径

仅仅是思路,因此直接使用ai代码做示例。

import json
from pathlib import Path
from datetime import datetimedef update_json_field_by_path(file_path: str, indices_and_keys: list, new_value: any) -> bool:"""通过指定索引和键的路径,安全地修改 JSON 文件中的值。Args:file_path: JSON 文件的路径。indices_and_keys: 从根到目标字段的路径列表。例如: ["hika", "latest_login"] 或 [0, "hika", "latest_login"]new_value: 要写入的新值。Returns:bool: 如果成功找到并更新了字段,返回 True;否则返回 False。"""file = Path(file_path)# --- 1. 读取数据 ---try:if not file.exists():print(f"错误:文件不存在于路径 '{file_path}'")return Falsewith open(file, 'r', encoding='utf-8') as f:data = json.load(f)except Exception as e:print(f"读取或解析 JSON 文件时发生错误: {e}")return False# --- 2. 遍历路径找到目标字段 ---current_level = datapath_trace = []try:# 遍历路径列表,直到倒数第二个元素 (即目标字段的父级)for i, key_or_index in enumerate(indices_and_keys[:-1]):path_trace.append(str(key_or_index))# 检查当前级别是否包含下一个键/索引if isinstance(current_level, list):# 如果是列表,期望 key_or_index 是整数索引current_level = current_level[int(key_or_index)]elif isinstance(current_level, dict):# 如果是字典,期望 key_or_index 是字符串键current_level = current_level[str(key_or_index)]else:raise TypeError(f"路径错误:'{key_or_index}' 无法应用于 {type(current_level).__name__} 类型。路径终止于:{' -> '.join(path_trace)}")# 最终的键/字段名是路径列表的最后一个元素final_key = indices_and_keys[-1]# --- 3. 修改目标字段 ---if isinstance(current_level, dict) and str(final_key) in current_level:# 这一步是关键:只修改了内存中 data 变量的深层嵌套字段current_level[str(final_key)] = new_valueprint(f"字段路径 {' -> '.join(path_trace + [str(final_key)])} 已更新为: {new_value}")else:print(f"错误:无法在路径 {' -> '.join(path_trace)} 中找到字段 '{final_key}' 或目标不是字典。")return Falseexcept (IndexError, KeyError, TypeError, ValueError) as e:print(f"错误:无效的路径或结构不匹配。详细错误: {e}")return False# --- 4. 写入数据 (覆盖原文件) ---try:with open(file, 'w', encoding='utf-8') as f:# 使用 indent=4 保持文件格式美观json.dump(data, f, indent=4, ensure_ascii=False)return Trueexcept Exception as e:print(f"写入文件时发生错误: {e}")return False# ----------------------------------------------------
# 演示使用
# ----------------------------------------------------
USER_FILE = "users.json"
# 使用当前时间作为新值
current_time = datetime.now().isoformat(timespec='seconds')# --- 运行示例 ---
# 1. 初始化文件 (请确保文件结构与示例假设一致)
initial_data = [{"hika": {"latest_login": "", "email": "h.nagi@example.com"}, "id": 1},{"xxgal": {"latest_login": "", "email": "x.gal@example.com"}, "id": 2}
]
with open(USER_FILE, 'w', encoding='utf-8') as f:json.dump(initial_data, f, indent=4)print("--- 原始文件内容 ---")
print(open(USER_FILE, 'r', encoding='utf-8').read())
print("--------------------")# 目标:修改 data[0]['hika']['latest_login']
path_to_modify = [0, "hika", "latest_login"]
update_successful = update_json_field_by_path(USER_FILE, path_to_modify, current_time)if update_successful:print("\n--- 更新后的文件内容 (验证是否只修改了目标字段) ---")print(open(USER_FILE, 'r', encoding='utf-8').read())print("-------------------------------------------------------")

结论

折腾来折腾去,还不如直接获取然后修改。看上去不简洁的方法,反而变成了最简洁的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/936379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LSNet

一、第一页 1、现有的轻量级模型主要通过 自注意力机制 和 卷积 来进行 token混合,阻碍了 感知 和 聚集 过程的高效性。 2、感知 对token之间的上下文关系进行建模,聚合 则基于对应关系集成token特征。 3、自注意力机…

部署 GitLab 服务器 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Webpack 构建速度优化

Webpack 构建速度优化是一个系统工程,需要从多个维度进行优化。以下是全面的优化方案: 1. 分析工具先行 1.1 构建速度分析 # 安装速度分析插件 npm install --save-dev speed-measure-webpack-pluginconst SpeedMeas…

[模拟赛] 过关(pass)

前言: 我做不出 \(T1\) 我活鸡蛋。/kk 题目描述: 有 \(n+1\) 关卡,有一个机器人从关卡 \(1\) 开始闯关,每个关卡里有一个陷阱。机器人没有第 \(i\) 关的经验时会回到第 \(pi\) 关重新闯一遍,并获得了这一关的经验…

2025.10.13

马上月考了,文化课不能落下,11月还要考S组,但是自己现在dp还没练,效率太低了啊啊啊啊,年底前能学完内容吗(

c++初体验

#实验任务1 ##代码1 #include <iostream>2 #include <string>3 #include <vector>4 #include <algorithm>5 using namespace std;6 template<typename T>7 void output(const T &c)…

元宇宙的搜索引擎:如何在虚拟世界中查找信息 - 详解

元宇宙的搜索引擎:如何在虚拟世界中查找信息 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&quo…

四则运算错题本和错题重做的建立

1.建立一个储存错题的字符串数组 2.通过循环记录错题数量,记录并打印今日正确率 3.通过循环将错题逐一遍历并与输入进来的答案进行比对判断正误

行列式的性质

转置 \[D = \begin{vmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \…

04_SQL语句一

04_SQL语句一 sql练习,可以先导入准备好的数据 https://github.com/datacharmer/test_db 随意导入,练习SQL玩法1.MySQl核心SQL语句 SQL,英文全称为Structured Query Language,中文意思是结构化查询语言,它是一种…

死锁的原因、表现以排查

什么是死锁 死锁是指两个或两个以上的线程(或进程)在执行过程中,因为争夺资源而陷入的相互等待的状态,若无外力干涉,它们都无法推进下去。 表现 1、用户反馈:哪个功能卡住了,具体的操作路径是什么?涉及哪些页面…

详细介绍:【C++】二叉搜索树

详细介绍:【C++】二叉搜索树pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

朱世乐的 Johnson 算法笔记

这个算法的使命是啥? 解决“全源最短路”问题(所有点到所有点的最短路)。 特别擅长处理带负权边的稀疏图。是对“跑N遍SPFA”的巨大优化。 核心思想?(天才的魔法) Dijkstra 很快,但怕负权边。 Johnson 的想法:…

完整教程:文心大模型4.5:百度推出的新一代原生多模态基础大模型

完整教程:文心大模型4.5:百度推出的新一代原生多模态基础大模型pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

day010

今日完成:java时间timer,html 明日完成:sql 遇到问题:无

详细介绍:DVWA | XSS 跨站脚本注入

详细介绍:DVWA | XSS 跨站脚本注入2025-10-13 19:29 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

实用指南:JVM栈溢出时如何dump栈信息?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

20232323 2025-2026-1《网络与系统攻防技术》实验一实验报告

一.实验内容 本次实验针对 Linux 平台可执行文件 pwn1,围绕缓冲区溢出(BOF)漏洞挖掘与 shellcode 注入技术展开,核心目标是通过三种路径篡改程序执行流程:1. 手动修改机器指令,将 main 函数调用的 foo 函数替换…

树莓派4B安装WiringPi使用gpio命令

1.使用Git下载WiringPi C 源码 git clone https://github.com/WiringPi/WiringPi.git2.编译源码 安装 ./build卸载 ./build uninstall 3.执行命令gpio -v,查看WiringPi版本4.使用gpio readall查看gpio状态5.使用pinou…