【问题标题】:Extracting a specific value from JSON in Bash在 Bash 中从 JSON 中提取特定值
【发布时间】:2017-12-25 22:43:43
【问题描述】:

我试图从 json 字符串中提取一个特定值。字符串如下所示:

{"801":{"170":{"100":"25.12.17 23:38:30","101":0,"102":0,"103":0,"104":0,"105":400,"106":200,"107":51100,"108":5329700,"109":17596300,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":5500}}}

我试图将“105”(本例中为 400)后面的值放入变量中。我尝试了以下方法:

wget -qO- --post-data='{"801":{"170":null}}' http://192.168.1.11/getjp \
|sed -e 's/[{},]/\n/g' \
| stroom=$ awk -F : '
            {if($1=="\"105\"") {print  $2}};

这会打印出我想要的值 (400) 但变量是空的。

从 JSON 字符串中提取确切值的最佳方法是什么?

【问题讨论】:

标签: json bash api variables


【解决方案1】:

正如 here 所提到的,使用 Python 之类的工具是处理 JSON 的好方法。在您的示例中:

data='{"801":{"170":{"100":"25.12.17 23:38:30","101":0,"102":0,"103":0,"104":0,"105":400,"106":200,"107":51100,"108":5329700,"109":17596300,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":5500}}}'
res=`echo $data | python -c "import sys, json; print json.load(sys.stdin)['801']['170']['105']"`
echo "Result: $res"
#Prints "Result: 400"

【讨论】:

    【解决方案2】:

    你最好用jq:

    wget -qO- --post-data='{"801":{"170":null}}' http://192.168.1.11/getjp \
    | jq '."801" | to_entries[] | [{"key": .key, "value": .value."105"}]' \ 
    | grep value | awk '{print $2}'
    

    更简单:

    wget -qO- --post-data='{"801":{"170":null}}' http://192.168.1.11/getjp \
    | jq '."801" | ."170" | ."105"'
    

    结果为变量:

        variable=$(wget -qO- --post-data='{"801":{"170":null}}' http://192.168.1.11/getjp \
        | jq '."801" | ."170" | ."105"')
        echo ${variable}
    400
    

    安装它:yum -y install jqapt-get install jq

    jq 手册在这里:https://stedolan.github.io/jq/manual/

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2015-06-12
      • 2018-11-19
      • 2016-12-25
      相关资源
      最近更新 更多