繁体   English   中英

使用 jq 将 JSON 解析为数组 - bash

[英]Parsing JSON to array using jq - bash

我有 JSON 看起来像这样:

[
  {
    "file": "aaa.txt",
    "destination": 1
  },
  {
    "file": "bbb.txt",
    "destination": 2
  },
  {
    "file": "ccc.txt",
    "destination": 3
  },
  {
    "file": "ddd.txt",
    "destination": 4
  },
  {
    "file": "eee.txt",
    "destination": 9
  }
]

我正在尝试使用命令 jq 在 bash 中构建一个脚本来获取 JSON 中的项目数,并在第二个命令中使用文件的值和目标。 为了实现我使用的第一个

count=$(curl 'http://mypage/json' | jq length)

我正在获取这些元素的数量(计数)(在这种情况下为 5)。 接下来,我想构建从 5 到 1 的while 循环,以将文件值放入 (nomen omen) 文件中(循环中的脚本应创建名为[destination] 的文件,其中[file]作为内容(例如:对于第一个文件,应通过aaa.txt 作为内容。而且...这是我的问题 - 如何将我的 JSON 放入数组(或其他内容)中?我尝试使用

arr=$(curl 'http://mypage/json' | jq'.[]')

但它把整个 json 合而为一。 你能帮我吗?

有几种使用 jq 解决问题的合理方法,但都有一个共同点,即 jq 只被调用一次。 由于bash是标签之一,如果“目标”文件名是合法的,你可以做的比以下更糟:

while IFS= read -r destination; do
    IFS= read -r file
    printf "%s" "$file" > "$destination"
done < <(jq -r '.[] | .destination,.file' input.json )

但是,这也假设字段的内容不包含“换行符”或 NUL 字符。 如果其中任何一个可能包含文字换行符,请参见下文。

此外,检查文件名的有效性和/或处理由于写入指定文件名的尝试失败而引起的错误几乎肯定会更好。 例如,请参见Windows 和 Linux 目录名称中禁止使用哪些字符?

处理换行

假设键值不包含 NUL 字符:

while IFS= read -r -d '' destination; do
    IFS= read -r -d '' file
    printf "%s" "$file" > "$destination"
done < <(jq -rj '.[] | map_values(tostring+"\u0000") | .destination,.file' input.json )

暂无
暂无

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

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