首页 > 解决方案 > 从 JSON Shell 命令中分离对象

问题描述

我有一个如下的 JSON 数组。

[ { "release": "2008.1006", "kernel": "2.6.32-754.3.5", "os": "6.10", "current": true }, { "release": "2008.1006", "kernel": "3.10.0-862.14.4", "os": "7.5", "current": true } ]

当我使用 打印数组长度${#array[@]}时,它给了我 1。我想要一个包含使用 shell 脚本的数组中存在的对象的数组。

我想要花括号下的对象数组。尝试了很多黑客,但我没有得到任何想要的结果。

标签: jsonshell

解决方案


s='[ { "release": "2008.1006", "kernel": "2.6.32-754.3.5", "os": "6.10", "current": true }, { "release": "2008.1006", "kernel": "3.10.0-862.14.4", "os": "7.5", "current": true } ]'
IFS=$'\n' read -r -d '' -a items < <(jq -c '.[]' <<<"$s" && printf '\0')

echo "Number of items: ${#items[@]}"
(( ${#items[@]} )) && printf ' - %s\n' "${items[@]}"

...正确发出:

Number of items: 2
 - {"release":"2008.1006","kernel":"2.6.32-754.3.5","os":"6.10","current":true}
 - {"release":"2008.1006","kernel":"3.10.0-862.14.4","os":"7.5","current":true}

如果仅支持 bash 4.0 或更高版本,您可以换掉(尽管如果调用失败read -areadarray -t这将不再通过不成功的退出状态):jq

readarray -t items <<<"$(jq -c '.[]' <<<"$s")"

推荐阅读