繁体   English   中英

用jq迭代json

[英]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)"'

通过这种方式,过滤器是独立于节点(动态数的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)"并通过设置IFS=|在while循环中使用read命令 所以变量存储得恰当。


总是使用官方的jq - 文档获取帮助,并使用这个漂亮的游乐场来测试过滤器, jq - online

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM