用jq迭代json

时间:2017-12-28 10:36:27

标签: json bash jq

我正在解析一个给我发送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是动态的,可以随时改变。我在这里做错了什么?

1 个答案:

答案 0 :(得分:9)

假设您的根节点名称为newList,与给出的问题相同,为了获得id和创建日期,您可以使用jq进行字符串插值

api-producing-json | jq --raw-output '.newList[] | "\(.id) \(.create.date)"'

这样,过滤器与节点中的动态数字无关(243244)。如果需要带引号的输出,请删除--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