首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Bash关联数组/列表/另一个模型中访问JSON对象

在Bash关联数组/列表/另一个模型中访问JSON对象
EN

Stack Overflow用户
提问于 2014-11-03 23:21:13
回答 5查看 42.6K关注 0票数 30

我有一个Bash脚本,在JSON中获取数据,我希望能够将JSON转换为一个可访问的结构-数组/列表/或其他模型,这将很容易解析嵌套数据。

示例

代码语言:javascript
复制
{
  "SALUTATION": "Hello world",
  "SOMETHING": "bla bla bla Mr. Freeman"
}

我想要获得如下值:echo ${arr[SOMETHING]}

不同的方法也是可选的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-11-03 23:28:53

如果你想要键和值,并且基于How do i convert a json object to key=value format in JQ,你可以这样做:

代码语言:javascript
复制
$ jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" file
SALUTATION=Hello world
SOMETHING=bla bla bla Mr. Freeman

在更一般的方法中,您可以像这样将值存储到数组myarray[key] = value中,只需使用while ... do; ... done < <(command)语法为while提供jq

代码语言:javascript
复制
declare -A myarray
while IFS="=" read -r key value
do
    myarray[$key]="$value"
done < <(jq -r 'to_entries|map("(.key)=(.value)")|.[]' file)

然后,您可以像这样遍历这些值:

代码语言:javascript
复制
for key in "${!myarray[@]}"
do
    echo "$key = ${myarray[$key]}"
done

对于这个给定的输入,它返回:

代码语言:javascript
复制
SALUTATION = Hello world
SOMETHING = bla bla bla Mr. Freeman
票数 31
EN

Stack Overflow用户

发布于 2017-10-31 09:23:48

这是如何递归完成的:

代码语言:javascript
复制
#!/bin/bash

SOURCE="$PWD"
SETTINGS_FILE="$SOURCE/settings.json"
SETTINGS_JSON=`cat "$SETTINGS_FILE"`

declare -A SETTINGS

function get_settings() {
    local PARAMS="$#"
    local JSON=`jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" <<< "$1"`
    local KEYS=''

    if [ $# -gt 1 ]; then
        KEYS="$2"
    fi

    while read -r PAIR; do
        local KEY=''

        if [ -z "$PAIR" ]; then
            break
        fi

        IFS== read PAIR_KEY PAIR_VALUE <<< "$PAIR"

        if [ -z "$KEYS" ]; then
            KEY="$PAIR_KEY"
        else
            KEY="$KEYS:$PAIR_KEY"
        fi

        if jq -e . >/dev/null 2>&1 <<< "$PAIR_VALUE"; then
            get_settings "$PAIR_VALUE" "$KEY"
        else
            SETTINGS["$KEY"]="$PAIR_VALUE"
        fi
    done <<< "$JSON"
}

要调用它:

代码语言:javascript
复制
get_settings "$SETTINGS_JSON"

该数组将按如下方式访问:

代码语言:javascript
复制
${SETTINGS[grandparent:parent:child]}
票数 4
EN

Stack Overflow用户

发布于 2018-05-05 17:18:43

要有效地将JSON对象加载到bash关联数组中(而不使用bash中的循环),可以使用工具'jq',如下所示。

代码语言:javascript
复制
# first, load the json text into a variable:
json='{"SALUTATION": "Hello world", "SOMETHING": "bla bla bla Mr. Freeman"}'

# then, prepare associative array, I use 'aa':
unset aa
declare -A aa

# use jq to produce text defining name:value pairs in the bash format
# using @sh to properly escape the values
aacontent=$(jq -r '. | to_entries | .[] | "[\"" + .key + "\"]=" + (.value | @sh)' <<< "$json")

# string containing whole definition of aa in bash
aadef="aa=($aacontent)"

# load the definition (because values may contain LF characters, aadef must be in double quotes)
eval "$aadef"

# now we can access the values like this: echo "${aa[SOMETHING]}"

警告:这使用eval,如果json输入来自未知来源(可能包含eval可能执行的恶意shell命令),这是很危险的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26717277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档