我正在解析一个给我发送JSON响应的API:
{
"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是动态的,可以随时改变。我在这里做错了什么?
答案 0 :(得分:9)
假设您的根节点名称为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)"
并使用read
通过设置IFS=|
在while循环中命令,以便适当地存储变量。
始终使用官方jq - documentation寻求帮助,并使用这个漂亮的游乐场来测试过滤器,jq - online