【问题标题】:Getting JSON value from cURL in Linux Bash [duplicate]从 Linux Bash 中的 cURL 获取 JSON 值 [重复]
【发布时间】:2015-05-12 08:47:20
【问题描述】:

我想GET 来自服务器的一些 json 数据。我这样做是:

UPDATE=$(curl -i -H "Accept: application/json" -H "Content-Type: application/json" --cookie "${COOKIE_NAME}" "${1}/update/${DEVICE_NAME}");

在此之前,服务器已经过身份验证。 ${1} 是服务器域,${DEVICE_NAME} 是请求更新的设备的名称。

这会返回一个 JSON,如下所示:

[{"_id":"54ff35887d8ef574029b9166","user":"54fe4313883bcec2c0ac0d64","__v":0,"created":"2015-03-10T18:18:48.023Z","status":"可用","pbo_udid":"lemaker","installation_script":"","description":"打印 你好世界 控制台","package_name":"helloworld_1.0-1.deb","name":"Hello World V1"}]

我现在想做两件事:

  1. 确保返回数据(如果没有可用更新,服务器返回[]
  2. 提取数据,例如package_name

如何在 Linux bash 脚本中执行这些操作?

【问题讨论】:

  • 您可能需要将 JSON 值传递给 CLI,以便脚本处理器可以反序列化 JSON 字符串并提取您要查找的数据。 (例如 PERL、PHP 等)。当然,到那时,我可能只会编写整个逻辑来检索和提取该脚本语言中的数据。除此之外,您可能会考虑将sedawk 等一些尴尬的组合放在一起,从本质上构建一个反序列化器。
  • 有一些非常棒的工具可以从 bash 中解析 JSON; jq 就是其中之一。

标签: json linux bash curl


【解决方案1】:

使用jqjsawk 更容易、更可靠地完成:

content=$(curl ...)
package_name=$(jq -r '.package_name' <<<"$content")

【讨论】:

    【解决方案2】:

    假设没有嵌套数组:

    cat <<EOF | json_reformat | \
        sed -rne '/:/s@^\s+"(\w+)":\s+"([^"]+)",?@json_\1="\2"@gp'
    [{"_id":"54ff35887d8ef574029b9166","user":"54fe4313883bcec2c0ac0d64","__v":0,"created":"2015-03-10T18:18:48.023Z","status":"available","pbo_udid":"lemaker","installation_script":"","description":"Prints hello world to console","package_name":"helloworld_1.0-1.deb","name":"Hello World V1"}]
    EOF
    

    返回

    json__id="54ff35887d8ef574029b9166"
    json_user="54fe4313883bcec2c0ac0d64"
    json_created="2015-03-10T18:18:48.023Z"
    json_status="available"
    json_pbo_udid="lemaker"
    json_description="Prints hello world to console"
    json_package_name="helloworld_1.0-1.deb"
    json_name="Hello World V1"
    

    您需要json_reformat 才能使用。

    编辑:没有json_reformat

    cat <<EOF | \
        sed -re 's@(\[|\]|\{|\})@@g' -e 's/,/\n/g' | \
        sed -re 's@"(\w+)":\s*"?([^"]*)"?@json_\1="\2"@g'
    [{"_id":"54ff35887d8ef574029b9166","user":"54fe4313883bcec2c0ac0d64","__v":0,"created":"2015-03-10T18:18:48.023Z","status":"available","pbo_udid":"lemaker","installation_script":"","description":"Prints hello world to console","package_name":"helloworld_1.0-1.deb","name":"Hello World V1"}]
    EOF
    

    它返回(注意重新格式化的版本号):

    json__id="54ff35887d8ef574029b9166"
    json_user="54fe4313883bcec2c0ac0d64"
    json___v="0"
    json_created="2015-03-10T18:18:48.023Z"
    json_status="available"
    json_pbo_udid="lemaker"
    json_installation_script=""
    json_description="Prints hello world to console"
    json_package_name="helloworld_1.0-1.deb"
    json_name="Hello World V1"
    

    您现在可以尝试使用 eval 解析此文本或从标准输入获取它。

    【讨论】:

    • 谢谢。有什么办法不用下载json_format??我不想安装其他文件
    • 也许可以增强sed 脚本。我喜欢json_reformat 的原因是它可以让您免去验证和清理收到的数据的负担。
    • 查看我编辑的回复,没有json_reformat
    • 将从网页检索到的内容传送到eval?您是否尝试让您的系统植根?
    • @charles-duffy 不是我的,不... 更严重的是,这当然是一个暗示。使用邪恶的eval 肯定不是唯一的选择。然而,它们很少,因为 OP 不希望有补充包。
    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2016-12-10
    • 2018-03-12
    • 2016-12-25
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    相关资源
    最近更新 更多