在OpenWRT(bash)上从JSON获取键值对

时间:2014-03-10 11:46:36

标签: json bash openwrt

我正在开发一个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,但它只能提取已知密钥的值。

4 个答案:

答案 0 :(得分:0)

使用greptr

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 jqsudo 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