利用jq转换或修改JSON数据类型的实践方法

更新时间:2024-05-01 11:50:13   人气:555
在日常的数据处理与编程工作中,`jq`工具已经成为了一种强大且高效的利器。它是一款专门用于操作 JSON 数据的命令行实用程序,在解析、过滤和转化复杂的JSON对象时展现出了卓越的能力。以下将通过一些实际示例详细阐述如何使用 `jq` 进行动态地转换和修改JSON类型的数据。

### 1. 简单查询提取特定值

假设我们有一个如下的JSON文件:

json

{
"name": "John",
"age": 30,
"city": "New York"
}


如果我们想要仅获取用户的名字,则可以运行如下 jq 命令:

bash

cat file.json | jq '.name'
# 输出结果:
"John"

这里`.name`是一个路径表达式,用来指定我们需要检索的具体字段名。

### 2. 复杂结构中筛选并变换数据

考虑一个更复杂的情况:

json

[
{
"id": 1,
"title": "Post One",
"author": {"firstName": "Alice", "lastName": "Smith"},
"tags": ["news","tech"]
},
{
"id": 2,
"title": "Post Two",
"author": {"firstName": "Bob", "lastName": "Johnson"},
"tags": ["sports","entertainment"]
}
]

如果我们要从这个数组里抽取所有作者全名,并转化为新的格式(例如:"Author Name: Alice Smith") ,则可采用下面的方式:

bash

cat complex_data.json | jq -r 'map({fullName : .author.firstName + " " + .author.lastName})[]'
# 输出结果:
{"fullName":"Alice Smith"}
{"fullName":"Bob Johnson"}

上述例子展示了 `-r` 参数来输出未经引号转义的结果以及 map 函数的应用,它可以对输入流中的每一个元素应用给定函数进行迭代计算。

### 3 修改现有属性值或添加新键值

若需更改“Post One”的 title为 “Article One”,同时为其增加一个新的 key-value 对:“category”: "General News":

bash

<input='[...]' jq '
(.[]|select(.title == "Post One")).title = "Article One";
(.[]|select(.title == "Post One")) += { category: "General News" }' > output.json

在这段代码中,首先用 select() 方法定位到需要更新的对象;然后赋值语句 `.title="Article One"` 更改了原有属性值; 最后 "+= {...}" 结构允许我们在原对象基础上新增键值对。

总结来说,无论是简单的取值还是深度遍历、重组及编辑Json内容,《jq》以其灵活高效的功能特性提供了强大的支持。熟练掌握其语法及运用场景能极大地提高我们的工作效率,尤其是在大规模自动化脚本编写或是API响应分析等任务上表现尤为突出。