Python实现JSON配置文件行替换后自动顺延refId编号的方案
原代码存在的核心问题
- 定位逻辑失效:用
repr(lines).find(find)做文本匹配的方式完全不可靠,repr会对原始文本加引号转义,算出来的索引存在固定偏移,根本匹配不到真实文件内的内容位置 - 业务逻辑缺失:纯字符串替换的实现没有覆盖refId自动顺延的规则,就算文本替换成功也不符合业务要求
- 文件写入有bug:
r+模式下光标移动后写入内容,不会自动清除原光标位置之后的残留旧文本,很容易造成JSON文件格式损坏 - 运行报错:代码最后调用的
find_append_to_file()函数没有定义,执行时会直接抛出NameError
推荐的正确实现方案
处理结构化JSON配置文件,绝对不推荐用逐行字符串硬匹配的方式修改,最稳妥的流程是:先把JSON完整解析为Python可操作的结构化对象,在内存里完成业务逻辑调整,再把修改后的对象序列化写回文件,从根源避免格式损坏、定位不准的问题。
实现步骤
- 读取完整的JSON配置文件,解析为Python列表(对应JSON配置数组)
- 遍历所有原有配置项,把每个项的
refId后缀数字+1完成顺延 - 把新建的、
refId为example_link1的配置项插入列表最前端 - 把调整完成的列表重新格式化为合法JSON写回原文件
示例可运行代码
import json # 替换为你的实际配置文件路径 publishedjsonfilepath = "config.json" # 要插入的新首条配置项 new_config = { "refId": "example_link1", "enabled": True, "visible": True } # 读取解析原有配置 with open(publishedjsonfilepath, 'r', encoding='utf-8') as f: config_list = json.load(f) # 原有所有配置的refId顺延 for item in config_list: # 从原refId中提取数字部分 old_num = int(item["refId"].split("example_link")[-1]) item["refId"] = f"example_link{old_num + 1}" # 新配置插到列表最前面 config_list.insert(0, new_config) # 写回调整后的配置 with open(publishedjsonfilepath, 'w', encoding='utf-8') as f: json.dump(config_list, f, indent=4, ensure_ascii=False)
方案优势
- 完全避开字符串定位、转义匹配偏移、光标位置算错等一系列硬编码改文本的bug
- 顺延逻辑是通用的,不管原配置数组有多少个
example_linkN的项,都会自动完成编号调整,不需要手动计算位置 - 写回的JSON格式标准统一,不会因为字符串替换留下格式错乱的问题
注意:如果你的原配置文件包含注释、trailing逗号这类非标准JSON语法,先把文件内容清理为合法JSON格式再走上述流程,不要用硬字符串匹配的方式直接修改,很容易出现格式损坏。
内容的提问来源于stack exchange,提问作者cabo
相关产品推荐
相关产品推荐

