作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在解析一个 API,它向我发送如下 JSON 响应:
{
"newList": {
"243": {
"id": "243",
"name": "test",
"create": {
"date": "2017-08-31 13:57:29"
}
},
"244": {
"id": "244",
"name": "test",
"create": {
"date": "2017-08-31 13:57:29"
}
}
}
}
我正在尝试使用带有 jq 的 bash 从中获取名称和创建日期,所以几乎没有成功。
jq '.newList' 确实有效并使我下降了一个级别,但这还不够。
jq '.newList .243' 给我一个编译错误。此外,243 是动态的,可以随时更改。我在这里做错了什么?
最佳答案
假设你的根节点名称是 newList
正如你在给定的问题中所拥有的那样,要获取 id
和创建日期,你可以使用 jq 进行字符串插值
api-producing-json | jq --raw-output '.newList[] | "\(.id) \(.create.date)"'
这样过滤器独立于节点中的动态数字(243
,244
)。如果您需要带引号的输出,请删除 --raw-output
标志。
要在循环中进一步处理,您可以在 bash 循环中迭代它,
while read -r id name date; do
echo "Do whatever with ${id} ${name} ${date}"
done< <(api-producing-json | jq --raw-output '.newList[] | "\(.id) \(.name) \(.create.date)"')
或者如果您担心任何字段中的空格,甚至更仔细地分隔单词,请在过滤器中使用分隔符作为 |
作为 "\(.id)|\(.name)|\(.create.date)"
并通过设置 IFS=|
在 while 循环中使用 read
命令,因此变量是妥善保存。
始终使用官方jq - documentation寻求帮助并使用这个不错的 Playground 来测试过滤器,jq - online
关于json - 用 jq 遍历 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48005870/
我是一名优秀的程序员,十分优秀!