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

如何在指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:32:31