gpt4 book ai didi

arrays - 使用 readarray 将 json 字典转换为 bash 哈希表

转载 作者:行者123 更新时间:2023-12-02 01:42:43 26 4
gpt4 key购买 nike

首先是一个数组的工作示例

json_array() {
local -n array="${1}"
readarray -d $'\0' -t array < <(
# Create nul delimited array entry using jq
jq -cjn --argjson arr "$array" '$arr|map(tostring)|.[]+"\u0000"'
)
}

> unset arr; arr='["a", "b", "c"]'; json_array arr; echo "${arr[0]} ${arr[1]} ${arr[2]}"
a b c

现在我正在尝试用 dict 做类似的事情,将 json dict 转换为 bash 关联数组

json_dict() {
local -n dict="${1}"
declare -A hash_table

append_to_hash_table() {
shift
{ read -r key; read -r value; } <<<"$1"
hash_table+=([$key]="$value")
}

readarray -d $'\0' -c 1 -C append_to_hash_table < <(
# Create nul delimited dict entry using jq
jq -cjn --argjson d "$dict" '$d|to_entries|map("\(.key)\n\(.value|tostring|@sh)")|.[]+"\u0000"'
)

# Here hash_table contain the correct output
dict=""
dict="$hash_table"
}

> unset arr; arr='{"a": "aa", "l": "bb", "c": "ccccc"}'; json_dict arr; echo "${arr[@]}"
Nothing

似乎 dict="$hash_table" 没有正确更新引用名称,如何使 bash dict refname 指向 hash_table

最佳答案

此处不需要 readarray:您可以将两个单独的 NUL 分隔的 read 作为 while 循环的一部分。

请参阅 https://replit.com/@CharlesDuffy2/GrandioseDraftyArguments#main.sh 中演示的以下答案

while IFS= read -r -d '' key && IFS= read -r -d '' value; do
hash_table[$key]=$value
done < <(jq -cjn --argjson d "$arr" \
'$d | to_entries[] | ( .key, "\u0000", .value, "\u0000")')

将其放在上下文中:

json_dict() {
declare key value in_value="${!1}"
unset "$1" # FIXME: Better to take a $2 for output variable
declare -g -A "$1"
declare -n hash_table="$1"
while IFS= read -r -d '' key && IFS= read -r -d '' value; do
hash_table[$key]=$value
done < <(
jq -cjn --argjson d "$in_value" \
'$d | to_entries[] | ( .key, "\u0000", .value, "\u0000")'
)
}

arr='{"a": "aa", "l": "bb", "c": "ccccc"}'
json_dict arr
declare -p arr

...作为输出发出:

declare -A arr=([a]="aa" [c]="ccccc" [l]="bb" )

也就是说,要回答问题完全按照要求,因此使用readarray:

json_dict() {
declare -a pieces=()

readarray -d '' pieces < <(
jq -cjn --argjson d "${!1}" \
'$d | to_entries[] | ( .key, "\u0000", .value, "\u0000")'
)

unset "$1"
declare -g -A "$1"
declare -n hash_table="$1"
set -- "${pieces[@]}"

while (( $# )); do
hash_table[$1]=$2
{ shift && shift; } || return
done
}

arr='{"a": "aa", "l": "bb", "c": "ccccc"}'
json_dict arr
declare -p arr

关于arrays - 使用 readarray 将 json 字典转换为 bash 哈希表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71385680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com