将JSON数组读入Bash数组

3

我有以下的JSON文件:

{
  "data": {
    "allPost": {
      "edges": [
        {      
          "node": {
            "slug": "fp-cheat-sheet",
            "labels": [
              "FUNCTIONAL PROGRAMMING",
              "HASKELL",
              "SCALA"
            ]
          }
        },
        {
          "node": {
            "slug": "nlp-101",
            "labels": [
              "DATA SCIENCE",
              "NLP",
              "PYTHON"
            ]
          }
        }
      ]
    }
  }
}

我正在使用JQ编写一个Shell脚本来提取每个edge的信息。从每个edge(一个数组),我能够提取slugs,它是一个字符串,但无法提取另一个数组labels
readarray -t slugs < <(cat ${json_file_name} | jq .data.allPost.edges[].node.slug)

readarray -t tags < <(cat ${json_file_name} | jq .data.allPost.edges[].node.labels)

echo ${slugs[1]}
# successfully prints '"nlp-101"'

echo ${tags[1]}
# wrongly prints '"FUNCTIONAL PROGRAMMING",'


我希望提取每篇文章的标签,并以相同的格式将其打印在文件中。例如,对于 echo ${tags[1]},我希望它打印出:
 ["DATA SCIENCE", "NLP", "PYTHON"]

如何修复上述代码以按预期从上述JSON中提取标签?
2个回答

3

使用-c标志调用JQ,以便在单行中打印每个数组。

$ readarray -t tags < <(jq -c '.data.allPost.edges[].node.labels' file)
$ echo "${tags[1]}"
["DATA SCIENCE","NLP","PYTHON"]

1
可以通过一次巧妙使用ASCII的RS分隔符和jq调用来完成:
#!/usr/bin/env bash

json_file_name=a.json

read -r -d '' jqscript <<JQSCRIPT
.data.allPost.edges[].node.slug + "\u001e",
"\u0000",
(
  .data.allPost.edges[].node.labels | tostring
) + "\u001e"
JQSCRIPT

{
  IFS=$'\x1e' read -r -d '' -a slugs
  IFS=$'\x1e' read -r -d '' -a tags
} < <(
  jq -j "$jqscript" "$json_file_name"
)

declare -p slugs tags

echo "${tags[1]}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接