【问题标题】:How to get an element of a JSON object in bash?如何在 bash 中获取 JSON 对象的元素?
【发布时间】:2023-03-13 22:55:02
【问题描述】:

我正在使用 bash 文件执行 curl 命令,返回的是一个 json 对象。如何在这个 bash 文件中获取这个 json 对象的一个​​元素?

提出请求

https://sms.world-text.com/v2.0/sms/send?id=11111&key=Testkey&srcaddr=DA_Health&dstaddr=000000000000&method=PUT&txt=Message_Text_Text

回应

{"status":"1","error":"1000","desc":"授权失败"}

to="000000000000" 消息="测试消息" url="https://sms.world-text.com/v2.0/sms/send?id=11111&key=TestKey&srcaddr=SMSMsg&dstaddr=${to}&method=PUT&txt=${message}"

return=$(curl -sm 5 $url --data-urlencode "${message}" -A 'Test')

最后,“return”变量的值如下: {"status":"1","error":"1000","desc":"授权失败"}

我希望执行该验证

如果 [[ "$status" != 0]];那么

&2 回显“$return” 菲

但是如何从 bash 文件中的 $return 中获取元素“status”和他的值“1”?

【问题讨论】:

    标签: json bash curl


    【解决方案1】:

    使用与 JSON 无关的工具(如 awk、sed 等)处理 JSON 格式在意识形态上是错误的。 JSON 格式必须使用支持 JSON 的工具进行处理。

    例如,如果您的 curl 响应是多行 JSON(这种情况很常见),那么基于 sed 的解决方案很可能不适合您。

    使用 JSON 的 unix 实用程序之一是 jtc,使用该实用程序,您的解决方案将如下所示:

    status=$(<<<$return jtc -w[status] -qq)
    

    然后您就可以申请支票了:

    if [[ "$status" != 0]]; then
       >&2 echo "$return"
    fi
    

    PS> 披露:我是 jtc - 用于 JSON 操作的 shell cli 工具的创建者

    【讨论】:

      【解决方案2】:

      您可以使用sed 过滤掉$result 中的状态码。

      status=$(echo "$return" | sed -E 's/\{"status"\s?:\s?"([0-9]+)".*/\1/')
      

      然后可以做测试:

      if [[ "$status" != 0]]; then
         >&2 echo "$return"
      fi
      

      【讨论】:

        【解决方案3】:

        您可以使用jq。这是关于该工具的综合指南 -> https://stedolan.github.io/jq/tutorial/.

        例如

        echo '{ "foo": 123, "bar": 456 }' | jq '.foo'
        

        这将打印 123。

        它也适用于嵌套对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-02
          • 2020-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-15
          • 1970-01-01
          相关资源
          最近更新 更多