【发布时间】:2019-11-22 17:26:59
【问题描述】:
这个问题与Constructing a json hash from a bash associative array 正好相反。给定以下 JSON:
{
"a": "z",
"b": "y",
"c": "x"
}
我想要一个关联 Bash 数组。
【问题讨论】:
标签: arrays json bash jq associative-array
这个问题与Constructing a json hash from a bash associative array 正好相反。给定以下 JSON:
{
"a": "z",
"b": "y",
"c": "x"
}
我想要一个关联 Bash 数组。
【问题讨论】:
标签: arrays json bash jq associative-array
NUL 分隔的流是最安全的方法:
input='{"a":"z","b":"y","c":"x"}'
declare -A data=()
while IFS= read -r -d '' key && IFS= read -r -d '' value; do
data[$key]=$value
done < <(jq -j 'to_entries[] | (.key, "\u0000", .value, "\u0000")' <<<"$input")
注意jq -j 的使用,它禁止引用(如-r),但也禁止项目之间的隐式换行,让我们手动插入NUL。
请参阅https://github.com/stedolan/jq/issues/1271 中的讨论(明确请求以 NUL 分隔的输出模式的票证),其中首先建议使用此成语。
【讨论】:
你可以这样做:
while IFS=':' read k v
do
dict[$k]="$v"
done <<< "$( sed -E "s/(\"|,|{|})//g; /^ *$/d; s/^ *//g" input.txt )"
echo "The value of key 'a' is : ${dict[a]}"
希望对你有帮助!
【讨论】:
-E 参数的 sed。您的 JSON 在一行上有多个键/值对?不会工作。您的 JSON 在键名或值中有空格?不会工作。你的 JSON 有反斜杠转义的文字引号?不会工作。您的 JSON 在字符串中有文字 {s?他们消失了。等等。
declare -A dict=( [a]="z" [b]="y" [c]="x" )。显然那是无用/荒谬的; 通常的答案必须是好的,而不仅仅是单个样本输入。
map[string]string,只要键和值都是 C 字符串(也就是说,不包含 NUL)。 jq 同样可以处理 任何 有效的 JSON —— 它本身就是一种非常强大的编程语言,并且在需要嵌套数据结构操作的情况下,它比 bash 强大得多。也就是说——当然,所选择的工具隐含着领域限制;但这不是在顶部添加您自己的任意限制的理由或借口,尤其是而不公开它们。