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

如何提取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格式

关键注意点

  1. 不要依赖固定索引:serial在hardware中的位置不固定,必须通过键名匹配查找
  2. 所有提取操作加兜底:用get()(Python)或//(jq)处理字段不存在的情况
  3. 检查数组条目有效性:确保hardware的子条目是长度≥2的列表,避免索引越界

内容的提问来源于stack exchange,提问作者Linny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:42:40