使用jq将JSON数组值Map到字典的最简单方法是什么?

qlckcl4x  于 2023-05-30  发布在  其他
关注(0)|答案(2)|浏览(141)

如何使用jq创建一个键值字典?
如果我这样做:cat api_fm.json | jq -r "[ .[].name, .[].status ]"我收到:

[
  "plugin",
  "c_docker_2",
  "c_docker_5",
  "c_docker_4",
  "c_docker_3",
  "c_docker_1",
  "Started",
  "Started",
  "Started",
  "Started",
  "Started",
  "Started"
]

因此,我想将名称与状态Map如下:

[
   "plugin: started"
...
]
brccelvz

brccelvz1#

这里有一种方法:

jq 'map("\(.name): \(.status)")'
cuxqih21

cuxqih212#

在你的评论中处理需求。给出:

$ cat api_fm.json
[
  {"name":"plugin", "status":"Started"},
  {"name":"c_docker_2", "status":"Started"},
  {"name":"c_docker_5", "status":"Started"},
  {"name":"c_docker_4", "status":"Started"},
  {"name":"c_docker_3", "status":"Started"},
  {"name":"c_docker_1", "status":"Started"}
]

我们可以生成制表符分隔的名称-状态对,如

$ jq -r '.[] | [.name, .status] | @tsv' api_fm.json
plugin  Started
c_docker_2  Started
c_docker_5  Started
c_docker_4  Started
c_docker_3  Started
c_docker_1  Started

然后,创建bash关联数组

declare -A prod

while IFS=$'\t' read -r name status; do
    prod["$name"]=$status
done < <(
    jq -r '.[] | [.name, .status] | @tsv' api_fm.json
)

declare -p prod
declare -A prod=([c_docker_2]="Started" [c_docker_3]="Started" [c_docker_1]="Started" [c_docker_4]="Started" [c_docker_5]="Started" [plugin]="Started" )

相关问题