用jq迭代json

SnI*_*IpY 9 bash json 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"
      }
    }
 }
}
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