[英]Iterate over json with jq
我正在解析一个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 - 文档获取帮助,并使用这个漂亮的游乐场来测试过滤器, jq - online
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.