Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从OpenWRT(bash)上的JSON获取键值对_Json_Bash_Openwrt - Fatal编程技术网

从OpenWRT(bash)上的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

我正在从事一个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":"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+”部分改为“([^”]*)”,因为我有一些