商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Python 中使用列表推导式和循环提取 JSON 数组中动态路径的字段值

Python 中使用列表推导式和循环提取 JSON 数组中动态路径的字段值

  发布于2026-07-18 阅读(0)

扫一扫,手机访问

本文介绍如何在 Python 中替代 jq '.cis[].properties.cloud_vm_display_name' | grep -v null 命令,从多个结构相似但数组长度不一的 JSON 文件中稳健提取 cloud_vm_display_name 字段值,并规避空值与语法错误。

或许你之前一直在 Shell 里用 jq 处理 JSON 数组,一行命令搞定提取、再 pipe 给 grep 过滤空值,的确干净利落。但一旦搬到 Python 环境,很容易踩一个坑:试图写 data['cis'][] —— 这在 Python 里是非法语法(SyntaxError: invalid syntax),因为列表索引不能为空。正确的思路其实很简单:遍历 data['cis'] 这个列表,逐项访问嵌套字段,同时把空值和无效值过滤掉。下面给出一个完整、鲁棒的处理流程。

✅ 正确提取方式(推荐)

import json

# 示例:加载单个 JSON 文件(实际中可循环读取多个文件)
with open("server1.json", "r") as f:
    data = json.load(f)

# 提取所有非 null 的 cloud_vm_display_name(严格匹配字符串 'null')
names = []
for cis_item in data.get("cis", []):
    props = cis_item.get("properties", {})
    name = props.get("cloud_vm_display_name")
    # 注意:这里判断 name 是否为 None 或字符串 "null",而非模糊包含 'null'
    if name is not None and name != "null":
        names.append(name)

print(names)  # 输出: ['azuXXXXX', 'azuXXXXX', 'azuXXXXXX', ...]

这个循环写法清晰且易于调试。当然,如果你偏爱一行流,列表推导式也可以同样完成任务:

✅ 更简洁:列表推导式(一行高效实现)

names = [
    cis["properties"]["cloud_vm_display_name"]
    for cis in data.get("cis", [])
    if cis.get("properties", {}).get("cloud_vm_display_name") not in (None, "null")
]
⚠️ 注意:原始的 grep -v null 其实是有点粗糙的,它会误杀那些名字里含有 "null" 子串的合法值(比如 "anulled-vm")。更精确的做法是改用 != "null" 进行完整的字符串比较,同时把 Python 中的 None 也考虑进去——这才是语义等价的过滤逻辑。

✅ 批量处理多个 JSON 文件

import glob
import json

all_names = []
for filepath in glob.glob("*.json"):  # 匹配所有 JSON 文件
    try:
        with open(filepath, "r") as f:
            data = json.load(f)
        for cis in data.get("cis", []):
            name = cis.get("properties", {}).get("cloud_vm_display_name")
            if name and name != "null":  # 安全判空:非 None、非空字符串、非 "null"
                all_names.append(name)
    except (json.JSONDecodeError, OSError) as e:
        print(f"警告:跳过无效文件 {filepath} — {e}")

print(all_names)

? 补充说明:为什么不用 'null' in name?

有些资料里会写 if not 'null' in name,但这很容易误伤——比如 "cloud_null_server" 这种合法名称就会被无辜过滤掉。真实场景中,JSON 字段如果为空,通常表现为 null(在 Python 中变成 None),或者显式存储为字符串 "null"。所以推荐统一用 name not in (None, "null", "") 来做防御性判断,既简洁又准确。

✅ 总结

  • ❌ 错误:data['cis'][] —— Python 不支持空索引语法;
  • ✅ 正确:用 for 循环或列表推导式遍历 data['cis']
  • ✅ 安全:始终使用 .get() 避免 KeyError,并显式校验 None"null"
  • ✅ 扩展:结合 glob、异常处理,即可无缝替代 cat * | jq ... | grep 流水线。

通过以上方法,你不仅能精准复现 jq 的功能,还能获得更强的错误控制、类型安全与可维护性。整个处理过程就像给 JSON 数据做一次精细的“淘金”,既保留了有价值的字段,又把杂质清理得干干净净。

本文转载于:https://www.php.cn/faq/2341547.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注