如何提取JSON数组中hostname、distribution及序列号并生成报告
解决思路与实现方案
核心问题分析
你遇到的解析失败和整合报错,本质是没有做防御性的字段检查:要么是某些设备缺少hostname/distribution字段,要么是hardware数组结构不固定(比如没有serial条目、serial条目长度不足),直接硬索引会触发错误。
通用解决逻辑
不管用什么语言处理,核心步骤都是:
- 遍历JSON数组中的每个设备对象
- 安全提取顶层字段(hostname、distribution),字段不存在时用默认值兜底
- 动态查找serial:遍历
hardware数组,匹配键为serial的条目,找不到或条目无效时用默认值 - 最后将三个字段拼接成指定格式输出
Python 实现示例
适合处理大规模JSON,逻辑清晰易调试:
import json # 读取JSON文件 with open('devices.json', 'r', encoding='utf-8') as f: devices = json.load(f) # 遍历每个设备生成报告 for device in devices: # 提取顶层字段,不存在则用默认值 hostname = device.get('hostname', 'unknown_host') distribution = device.get('distribution', 'unknown_dist') # 初始化serial默认值 serial = 'no_serial' # 安全获取hardware数组,不存在则为空列表 hardware_list = device.get('hardware', []) # 遍历hardware找serial条目 for entry in hardware_list: # 确保条目是有效列表,且第一个元素是'serial' if isinstance(entry, list) and len(entry) >= 2 and entry[0] == 'serial': serial = entry[1] # 找到后立即退出循环,提升效率 break # 按要求格式输出(支持serial为null的情况) if serial is None: print(f"{hostname},{distribution},serial null") else: print(f"{hostname},{distribution},{serial}")
命令行工具 jq 实现示例
适合快速处理JSON文件,无需编写代码:
jq -r '.[] | .hostname // "unknown_host", .distribution // "unknown_dist", (.hardware[]? | select(.[0] == "serial") | .[1]) // "no_serial" | @csv' devices.json
//:字段不存在时使用默认值.hardware[]?:容错遍历,避免hardware不存在/非数组时报错@csv:自动处理字段包含特殊字符的情况,输出标准CSV格式
关键注意点
- 不要依赖固定索引:serial在
hardware中的位置不固定,必须通过键名匹配查找 - 所有提取操作加兜底:用
get()(Python)或//(jq)处理字段不存在的情况 - 检查数组条目有效性:确保
hardware的子条目是长度≥2的列表,避免索引越界
内容的提问来源于stack exchange,提问作者Linny
相关产品推荐
相关产品推荐

