首页 > 解决方案 > 将 JSON 数组读入 Bash 数组

问题描述

我有以下 json 文件:

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

我正在编写一个 shell 脚本来提取每个的信息edge,使用 JQ。从 each 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 中提取标签?

标签: arraysjsonbashjq

解决方案


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

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

推荐阅读