从OpenWRT(bash)上的JSON获取键值对
我正在从事一个OpenWRT项目,需要从服务器获取数据。 数据为JSON格式,如下所示:从OpenWRT(bash)上的JSON获取键值对,json,bash,openwrt,Json,Bash,Openwrt,我正在从事一个OpenWRT项目,需要从服务器获取数据。 数据为JSON格式,如下所示: {"key1":"value1","key2":"value2","key3":"value3"} keys[0]=key1 keys[1]=key2 keys[2]=key3 values[0]=value1 values[1]=value2 values[2]=value3 我想在bash中将其解析为2个数组,如下所示: {"key1":"value1","key2":"value2","key3
{"key1":"value1","key2":"value2","key3":"value3"}
keys[0]=key1
keys[1]=key2
keys[2]=key3
values[0]=value1
values[1]=value2
values[2]=value3
我想在bash中将其解析为2个数组,如下所示:
{"key1":"value1","key2":"value2","key3":"value3"}
keys[0]=key1
keys[1]=key2
keys[2]=key3
values[0]=value1
values[1]=value2
values[2]=value3
我厌倦了jshn.sh,但它只能提取已知键的值。使用
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 \":))
declare-a keys=($(grep-Eo'\w+“:”使用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 \":))
declare-a keys=($(grep-Eo'\w+“:”使用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 \":))
declare-a keys=($(grep-Eo'\w+“:”使用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 \":))
declare-a keys=($(grep-Eo''\w+“:')有更多适合读取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
!/bin/bash
声明-arr
字符串='{“key1”:“value1”,“key2”:“value2”,“key3”:“value3”}'
读取键值时;执行以下操作
[[-n“$key”]&&arr[“$key”]=“$value”
完成<有更多适合读取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
!/bin/bash
声明-arr
字符串='{“key1”:“value1”,“key2”:“value2”,“key3”:“value3”}'
读取键值时;执行以下操作
[[-n“$key”]&&arr[“$key”]=“$value”
完成<有更多适合读取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
!/bin/bash
声明-arr
字符串='{“key1”:“value1”,“key2”:“value2”,“key3”:“value3”}'
读取键值时;执行以下操作
[[-n“$key”]&&arr[“$key”]=“$value”
完成<有更多适合读取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
!/bin/bash
声明-arr
字符串='{“key1”:“value1”,“key2”:“value2”,“key3”:“value3”}'
读取键值时;执行以下操作
[[-n“$key”]&&arr[“$key”]=“$value”
完成<看一看
如果echo“键:$keys”;echo“值:$values”
将返回:
keys: [
"key1",
"key2",
"key3"
]
values: [
"value3",
"value2",
"value1"
]
我注意到,在我使用过的大多数Linux发行版中,jq
包含在软件包管理器中。您可以通过执行sudo-apt-get-install-jq
或sudo-yum-install-jq
来安装它,具体取决于您使用的软件包管理器。查看
如果echo“键:$keys”;echo“值:$values”
将返回:
keys: [
"key1",
"key2",
"key3"
]
values: [
"value3",
"value2",
"value1"
]
我注意到,在我使用过的大多数Linux发行版中,jq
包含在软件包管理器中。您可以通过执行sudo-apt-get-install-jq
或sudo-yum-install-jq
来安装它,具体取决于您使用的软件包管理器。查看
如果echo“键:$keys”;echo“值:$values”
将返回:
keys: [
"key1",
"key2",
"key3"
]
values: [
"value3",
"value2",
"value1"
]
我注意到,在我使用过的大多数Linux发行版中,jq
包含在软件包管理器中。您可以通过执行sudo-apt-get-install-jq
或sudo-yum-install-jq
来安装它,具体取决于您使用的软件包管理器。查看
如果echo“键:$keys”;echo“值:$values”
将返回:
keys: [
"key1",
"key2",
"key3"
]
values: [
"value3",
"value2",
"value1"
]
我注意到,在我使用过的大多数Linux发行版中,包管理器中都包含了jq
。您可以通过执行sudo-apt-get-install-jq
或sudo-yum-install-jq
来安装它,具体取决于您使用的包管理器。我建议使用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
我建议使用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
我建议使用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
我建议使用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
检查这些解决方案-sed/awk:或perl:检查这些解决方案-sed/awk:或perl:检查这些解决方案-sed/awk:或perl:检查这些解决方案-sed/awk:或perl:据我所知,OpenWRT没有jq可用。据我所知,OpenWRT没有jq可用。据我所知,Op没有jq可用enWRT。据我所知,OpenWRT没有可用的jq。我喜欢这个解决方案,因为一行键和值提取。我将regexp中的“\w+”部分更改为“([^”]*)"因为我的值中有一些特殊字符。谢谢你的帮助!@Kyokai此解决方案的级别太低了一点。由于默认情况下OpenWRT中已经安装了jshn,这可能是最好的选择。它将正确解析JSON对象,并且嵌套我喜欢此解决方案,因为一行键和值提取。我更改了将regexp中的“\w+”部分改为“([^”]*)”,因为我有一些