使用 jq 转换 JSON 数据

本文介绍 jq 命令行工具的基本与高级用法,用于高效处理 JSON 数据。涵盖核心过滤操作、性能优化、AI 集成以及 DevOps 工作流示例,适合处理大型文件和实时数据管道,帮助开发者简化 JSON 转换任务。

阅读时长: 3 分钟
共 1390字
作者: eimoon.com

使用 jq 转换 JSON 数据

引言

在处理大型 JSON 文件时,提取和操作特定信息往往充满挑战。像 sedawkgrep 这样的工具适合松散结构的数据,但对于机器可读的 JSON 格式,jq 更高效。jq 是一个用 C 语言编写的命令行 JSON 处理器,针对性能优化设计,便于集成到 shell 脚本、AI 工作流和 DevOps 管道中。它支持流式数据处理、大型文件(GB 级规模),以及现代场景如机器学习预处理或 Kubernetes 操作。

本文通过一个示例 JSON 文件,演示 jq 的基础用法,然后探讨高级技巧,包括 AI 集成、性能优化和生产环境工作流。

关键要点

  • 核心操作:使用 selectmapadd 等过滤器进行 JSON 操作。
  • 性能优化:通过流式处理和内存高效方式处理大型文件(5GB+)。
  • AI 集成:为 ML 管道预处理数据、实时 API 处理和 Kubernetes 环境。
  • 高级技巧:处理嵌套 JSON、实现条件逻辑,并为生产环境添加错误处理。
  • 现代工作流:集成 CI/CD、微服务和 AI 驱动系统。

先决条件

  • 安装 jq(例如,在 Ubuntu 上运行 sudo apt install jq)。
  • 基本的 JSON 知识(参考 JSON 介绍)。

步骤 1: 执行第一个 jq 命令

创建 seaCreatures.json 文件:

[
    { "name": "Sammy", "type": "shark", "clams": 5 },
    { "name": "Bubbles", "type": "orca", "clams": 3 },
    { "name": "Splish", "type": "dolphin", "clams": 2 },
    { "name": "Splash", "type": "dolphin", "clams": 2 }
]

使用身份过滤器(.)美化输出 JSON:

jq '.' seaCreatures.json

输出:带缩进的完整 JSON。

步骤 2: 提取 creatures

使用数组迭代(.[])和属性访问(.name)提取名称:

jq '.[] | .name' seaCreatures.json

输出:

"Sammy"
"Bubbles"
"Splish"
"Splash"

使用 -r 选项获取无引号的原始输出。

步骤 3: 使用 mapadd 计算 totalClams

求和所有 clams 值:

jq 'map(.clams) | add' seaCreatures.json

输出:12

map 转换数组,add 求和数值。

步骤 4: 计算 totalDolphinClams

过滤海豚并求和其 clams 值:

jq 'map(select(.type == "dolphin").clams) | add' seaCreatures.json

输出:4

结合 select 的条件过滤、mapadd

步骤 5: 转换数据为新结构

将过滤器组合成对象:

jq '{ creatures: map(.name), totalClams: map(.clams) | add, totalDolphinClams: map(select(.type == "dolphin").clams) | add }' seaCreatures.json

输出:

{
  "creatures": ["Sammy", "Bubbles", "Splish", "Splash"],
  "totalClams": 12,
  "totalDolphinClams": 4
}

这从原始数据创建新的 JSON 结构。

生产系统中的高级 jq 技巧

优化大型文件的性能

  • 使用 --stream 增量处理 GB 级文件。
  • 使用 -c 压缩输出以减少内存占用。
  • 示例:jq --stream 'select(.[0] | length == 2) | .[1]' large-file.json

AI 和机器学习集成

  • 数据预处理:为 ML 训练清理 JSON。
    curl -s "https://api.example.com/data" | jq -c '.[] | {feature1: .value1, target: .outcome}' > training.jsonl
    
  • 实时处理:流式数据用于推理。
    tail -f /var/log/api-responses.json | jq -c 'select(.status == "success") | {data: .payload}'
    

Kubernetes 和 DevOps 集成

  • 提取 Pod 信息:kubectl get pods -o json | jq '.items[] | select(.status.phase == "Running") | .metadata.name'
  • CI/CD:解析管道中的版本。
    VERSION=$(jq -r '.version' package.json)
    

错误处理和验证

  • 验证结构:jq 'if type == "object" then . else error("Invalid") end' input.json
  • 处理缺失字段:使用 ? 操作符,例如 .clams? // 0

现代用例和真实示例

  • API 处理:从 GitHub API 提取:curl -s "https://api.github.com/repos/stedolan/jq/issues" | jq '.items[] | {title: .title}'
  • 数据管道:转换为 CSV:jq -r '.[] | [.name, .type] | @csv' seaCreatures.json > output.csv
  • 监控:解析 kubectl 输出以获取指标。

常见问题

  1. 什么是 jq 一个基于 C 的 JSON 处理器,用于高效、JSON 感知的操作,在结构化数据上优于文本工具。

  2. 安装方法:Ubuntu 上 sudo apt install jq;macOS 上 brew install jq

  3. 常见命令

    • 美化打印:jq '.' file.json
    • 提取字段:jq '.name' file.json
    • 过滤:jq '.[] | select(.age > 18)' file.json
  4. 处理大型文件:是的,使用 --stream 实现流式和低内存使用。

  5. 与 Python/Node.js 比较jq 在 CLI 性能和流式处理上表现出色;Python/Node.js 更适合复杂逻辑。

  6. AI 集成:用于 ML 预处理(如特征提取)和实时管道。

结论

jq 简化了 JSON 转换,从基础过滤到高级生产任务,如 AI 预处理和 Kubernetes 集成。其 C 实现高效处理大规模数据。

更多信息,参考 jq 手册。相关教程: Python JSONJSONPathJSON 介绍

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计