我正在开发一个OpenWRT项目,我需要从服务器获取数据。 数据采用JSON格式,如下所示:
{"key1":"value1","key2":"value2","key3":"value3"}
我想用bash将它解析为2个数组,如下所示:
keys[0]=key1
keys[1]=key2
keys[2]=key3
values[0]=value1
values[1]=value2
values[2]=value3
我累了jshn.sh,但它只能提取已知密钥的值。
答案 0 :(得分:0)
使用grep
和tr
:
declare -a keys=($(grep -Eo '"\w+":' json | tr -d \":))
declare -a values=($(grep -Eo ':"\w+"' json | tr -d \":))
输出:
$ for i in 0 1 2; do echo "${keys[$i]} - ${values[$i]}"; done
key1 - value1
key2 - value2
key3 - value3
在这种情况下,我假设您的JSON数据存储在名为“json”的文件中 - 这可以替换为命令的输出,如下所示:
declare -a keys=($(grep -Eo '"\w+":' <(curl www.example.com/json?q=test) | tr -d \":))
答案 1 :(得分:0)
有更多合适的工具可以读取json文件,但您可以尝试以下方法:
#!/bin/bash
declare -A arr
string='{"key1":"value1","key2":"value2","key3":"value3"}'
while read key value; do
[[ -n "$key" ]] && arr["$key"]="$value"
done < <(sed 's/[\"{}]//g' <<< "$string" | awk -F: 'BEGIN{RS=","} {print $1" "$2}')
for i in ${!arr[@]}; do
echo "$i -> ${arr[$i]}"
done
答案 2 :(得分:0)
看看jq。
json='{"key1":"value1","key2":"value2","key3":"value3"}'
keys=`echo $json | jq 'keys'`
values=`echo $json | jq '. | [.[]]'`
如果你echo "keys: $keys"; echo "values: $values"
返回:
keys: [
"key1",
"key2",
"key3"
]
values: [
"value3",
"value2",
"value1"
]
我注意到在大多数Linux发行版中我使用jq
都包含在包管理器中。您可以通过执行sudo apt-get install jq
或sudo yum install jq
来安装它,具体取决于您使用的软件包管理器。
答案 3 :(得分:0)
我建议使用jq
来解决您的问题,但是这个软件包对于您运行openwrt的设备来说可能太重了。
openwrt上的主要JSON解析器由libubox
库提供。你可以用这个来解决你的问题。
. /usr/share/libubox/jshn.sh
json_init
json_load '{"key1":"value1","key2":"value2","key3":"value3"}'
json_get_keys keys
for k in $keys; do
json_get_var v "$k"
echo "$k : $v"
done