我正在解析一个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"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试图通过jq使用bash获取名称和创建日期,因此几乎没有成功.
jq'.newList'确实起作用并将我降低到一个级别,但这还不够.
jq'.newList .243'给了我一个编译错误.此外,243是动态的,可以随时改变.我在这做错了什么?
Ini*_*ian 11
假设您的根节点名称newList与给定问题中的一样,为了获得id和创建日期,您可以使用jq
api-producing-json | jq --raw-output '.newList[] | "\(.id) \(.create.date)"'
Run Code Online (Sandbox Code Playgroud)
这样,过滤器独立于节点(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)"')
Run Code Online (Sandbox Code Playgroud)
或者,如果您担心任何字段中的空格,则更加仔细地划分单词,使用|过滤器中的分隔符,"\(.id)|\(.name)|\(.create.date)"并read通过设置使用while循环中的命令,IFS=|以便适当地存储变量.
总是使用官方的jq - 文档获取帮助,并使用这个漂亮的游乐场来测试过滤器,jq - online