如何在指定JSON块末尾添加内容并定位块结束行号
解决方案:定位JSON块结束行并添加自定义内容
我来帮你搞定这个需求——不管是获取每个JSON块最后一个}的行号,还是在指定块末尾插入自定义内容,用Python或者命令行工具都能轻松实现,下面给你详细的步骤和代码示例:
1. 获取每个块最后一个}的行号
首先我们需要逐行扫描文件,跟踪当前处于哪个结构块,记录每个块最后出现}的行号。用Python写的话可读性很强,也容易调整:
def find_block_closing_lines(file_path): block_end_lines = {} current_block = None last_brace_line = 0 with open(file_path, 'r') as f: for line_num, line in enumerate(f, 1): # 识别块的起始标记(比如 "struct_personnal": [ ) if ': [' in line: # 提取块名称,去掉引号和空格 block_name = line.split(':')[0].strip().strip('"') current_block = block_name # 识别块的结束标记(对应的 ] 或者 ], ) if current_block and (']' in line or '],' in line): block_end_lines[current_block] = last_brace_line current_block = None # 记录当前块内所有 } 的行号,保留最后一个 if current_block and '}' in line: last_brace_line = line_num return block_end_lines # 调用示例,替换成你的文件路径 file_path = 'your_data.json' closing_lines = find_block_closing_lines(file_path) for block, line in closing_lines.items(): print(f"块「{block}」的最后一个 }} 位于行号: {line}")
代码逻辑说明:
- 从第一行开始逐行遍历文件,实时跟踪当前所在的块
- 遇到
: [就标记进入一个新块,提取块名称 - 在块内每遇到
}就更新当前块的最后}行号 - 当遇到块的结束符
]或],时,把记录的行号存入字典,结束当前块的跟踪
2. 在指定块末尾添加自定义文本
要在比如struct_personnal这样的块末尾加内容,我们需要找到它最后一个}的位置,在后面插入新的JSON元素。下面的代码会帮你完成这个操作,还会自动生成修改后的新文件(避免直接覆盖原文件):
def add_content_to_block(file_path, target_block, new_content): # 先获取目标块的最后 } 行号 closing_lines = find_block_closing_lines(file_path) if target_block not in closing_lines: print(f"抱歉,没找到「{target_block}」这个块") return target_line = closing_lines[target_block] modified_lines = [] with open(file_path, 'r') as f: lines = f.readlines() for line_num, line in enumerate(lines, 1): modified_lines.append(line) # 到达目标行时,插入自定义内容(记得加逗号保证JSON合法) if line_num == target_line: modified_lines.append(f", {new_content}\n") # 写入修改后的内容到新文件 output_file = f'modified_{file_path}' with open(output_file, 'w') as f: f.writelines(modified_lines) print(f"搞定!已在「{target_block}」块末尾添加内容,保存为 {output_file}") # 调用示例,替换成你要添加的内容 new_person_entry = '{"id": "2", "name": "Alice"}' add_content_to_block('your_data.json', 'struct_personnal', new_person_entry)
注意事项:
- 如果你要添加的是完整的JSON对象,要确保格式正确(引号、逗号都不能错)
- 代码会生成一个新文件,不会修改原文件,这样更安全
处理单行压缩JSON的情况
如果你的文件是像示例那样的单行压缩JSON,建议先把它格式化多行,这样更容易处理:
import json def format_compressed_json(file_path): with open(file_path, 'r') as f: data = json.load(f) formatted_file = f'formatted_{file_path}' with open(formatted_file, 'w') as f: json.dump(data, f, indent=4) print(f"已将压缩JSON格式化为多行,保存为 {formatted_file}") # 调用示例 format_compressed_json('your_data.json')
格式化之后,再用前面的两个函数处理就没问题了。
用命令行工具快速实现(可选)
如果你习惯用Shell命令,这里给你两个sed/awk的小技巧(适用于格式化后的多行JSON):
查找struct_hospital最后一个}的行号:
awk '/struct_hospital/{flag=1} flag && /}/{last_line=NR} /struct_hospital.*\]/{flag=0} END{print last_line}' your_data.json
在struct_personnal末尾添加内容:
sed '/struct_personnal/,/\]/{/}/{s/}/}, {"id": "2", "name": "Alice"}/}' your_data.json > modified_data.json
这个命令会在struct_personnal块内的最后一个}后面插入新元素,直接生成修改后的文件。
内容的提问来源于stack exchange,提问作者Crazy
相关产品推荐
相关产品推荐

