【问题标题】:Display curl output in readable JSON format in Unix shell script在 Unix shell 脚本中以可读的 JSON 格式显示 curl 输出
【发布时间】:2015-01-30 01:11:44
【问题描述】:

在我的 Unix shell 脚本中,当我执行 curl 命令时,结果将显示如下,我正在重定向到文件:

{"type":"Show","id":"123","title":"name","description":"Funny","channelTitle":"ifood.tv","lastUpdateTimestamp":"2014-04-20T20:34:59","numOfVideos":"15"}

但是,我希望此输出以可读的 JSON 格式放入文件中,如下所示:

{"type":"Show",
"id":"123",
"title":"name",
"description":"Funny",
"channelTitle":"ifood.tv",
"lastUpdateTimestamp":"2014-04-20T20:34:59",
"numOfVideos":"15"}

如何以这种方式格式化输出?

【问题讨论】:

    标签: json shell curl


    【解决方案1】:

    一些解决方案可供选择:

    json_pp:Linux 系统中用于 JSON 解码/编码的命令实用程序

    echo '{"type":"Bar","id":"1","title":"Foo"}' | json_pp -json_opt pretty,canonical
    {
       "id" : "1",
       "title" : "Foo",
       "type" : "Bar"
    }
    

    您可能希望保留 -json_opt pretty,canonical 参数以实现可预测的排序。


    :轻量级且灵活的命令行 JSON 处理器。它是用可移植的 C 语言编写的,运行时依赖为零。

    echo '{"type":"Bar","id":"1","title":"Foo"}' | jq '.'
    {
      "type": "Bar",
      "id": "1",
      "title": "Foo"
    }
    

    最简单的jq 程序是表达式.,它接受输入并将其作为输出原样生成。

    对于额外的jq 选项检查the manual


    :

    echo '{"type":"Bar","id":"1","title":"Foo"}' | python -m json.tool
    {
        "id": "1",
        "title": "Foo",
        "type": "Bar"
    }
    

    echo '{"type":"Bar","id":"1","title":"Foo"}' | node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"
    {
     "type": "Bar",
     "id": "1",
     "title": "Foo"
    }
    

    【讨论】:

    • 是这样吗?curl -i -vs -X POST -H "$SESSION_TOKEN" -H "$AUTH_TOKEN" -H "Accept:$ACCEPT_HEADER" -H "Content-Type:text/普通" "http://$BASE_URI/api" | json_pp >> jsonoutput.json
    • 当然。你测试过吗?
    • 是的,但没有写入文件“jsonoutput.json”。它的大小为零。
    • json_pp 似乎以与预期相反的顺序格式化数据。有没有办法取消反转数据?
    • json_pp 是一个 Perl 命令实用程序,可在某些输入和输出格式(其中一种 JSON)之间进行转换。默认输入格式为json,默认输出格式为带有漂亮选项的json。
    【解决方案2】:

    我猜你想美化 JSON 输出。 这可以使用 python 来实现:

    curl http://localhost:8880/test.json | python -mjson.tool > out.json
    

    【讨论】:

    • 感谢您的回答。但我没有使用 Python,我使用的是 shell。你能在 shell 上指导我吗
    • @Jams 从 shell 执行 python 给你一个漂亮的打印输出。
    • 预装了 python 的绝佳解决方案。
    • 当我向它添加“|head”时,python 脚本给出了“破管”错误。
    • @CrouchingKitten 我自己没有看到这个问题(可能是不同的版本),但这可能是由于head 命令在到达结束之前切断了输出,因此“打破”管道。如果您允许head 使用管道中的整个数据流,我希望错误不会出现。
    【解决方案3】:

    这是对 Gilles 回答的补充。有很多方法可以做到这一点,但我个人更喜欢在常见的 *nix 系统上使用轻量级、易于记忆和普遍可用的东西(例如,附带您喜欢的 Linux 风格的标准 LTS 安装或易于安装)。

    以下是按首选顺序排列的选项:

    Python Json.tool 模块

    echo '{"foo": "lorem", "bar": "ipsum"}' | python -mjson.tool
    

    优点:几乎随处可见;缺点:没有颜色编码


    jq(可能需要一次安装)

    echo '{"foo": "lorem", "bar": "ipsum"}' | jq
    

    缺点:需要安装jq;优点:颜色编码和多功能


    json_pp(在 Ubuntu 16.04 LTS 中可用)

    echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
    

    对于 Ruby 用户

    gem install jsonpretty
    echo '{"foo": "lorem", "bar": "ipsum"}' | jsonpretty
    

    【讨论】:

    • 谢谢@zhenhua!我使用cat myFile.json | python -mjson.tool >> myFilePretty.json 然后在我的编辑器中打开(vim,不要讨厌)并得到颜色。
    【解决方案4】:
    python -m json.tool
    Curl http://127.0.0.1:5000/people/api.json | python -m json.tool
    

    也可以帮忙。

    【讨论】:

      【解决方案5】:

      你可以使用the json node module:

      npm i -g json

      然后在 curl 之后简单地附加 | jsoncurl http://localhost:8880/test.json | json

      【讨论】:

      • 如果你不推荐它,我会删除关于 sudo 的评论和部分哈哈。我同意没有必要。感谢您的回答
      • 如果你不想安装json模块,你可以直接和npx一起使用:curl http://localhost:8880/test.json | npx json
      【解决方案6】:

      我发现 json_reformat 非常方便。所以我只是做了以下事情:

      curl http://127.0.0.1:5000/people/api.json | json_reformat
      

      就是这样!

      【讨论】:

      • 如果使用 Ubuntu,您可以在 yajl-tools 包中找到 json_reformat。
      【解决方案7】:

      动机:您想在 curl 命令请求后打印 prettify JSON 响应。

      解决方案json_pp - 在某些输入和输出格式(其中之一是 JSON)之间转换的命令行工具。该程序是从 json_xs 复制并修改的。默认输入格式为json,默认输出格式为带有漂亮选项的json。

      概要json_pp [-v] [-f from_format] [-t to_format] [-json_opt options_to_json1[,options_to_json2[,...]]]

      公式<someCommand> | json_pp

      示例

      请求

      curl -X https://jsonplaceholder.typicode.com/todos/1 | json_pp 
      

      回应

      {
         "completed" : false,
         "id" : 1,
         "title" : "delectus aut autem",
         "userId" : 1
      }
      

      【讨论】:

        【解决方案8】:

        查看curljson

        $ pip install curljson
        $ curljson -i <the-json-api-url>
        

        【讨论】:

          【解决方案9】:

          :

          curl <...> | xidel - -se '$json'
          

          xidel 可能也可以为您检索 JSON。

          【讨论】:

            【解决方案10】:

            除了格式化之外,还有更多功能(切片、过滤器和映射以及转换结构化)。

            https://stedolan.github.io/jq/

            【讨论】:

              【解决方案11】:

              您可以安装 jq 并进行如下查询:

              curl http://localhost:8080/observations/station/221 | jq
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-02-05
                • 2014-04-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-15
                • 2023-03-14
                相关资源
                最近更新 更多