【问题标题】:How can I pretty-print a JSON file from the command line?如何从命令行漂亮地打印 JSON 文件?
【发布时间】:2013-12-14 10:49:07
【问题描述】:

我有一个包含一系列 JSON 元素的文件:

{ element0: "lorem", value0: "ipsum" }
{ element1: "lorem", value0: "ipsum" }
...
{ elementN: "lorem", value0: "ipsum" }

是否有用于格式化 JSON 以以可读形式显示文件内容的 shell 脚本?

我看过this 的帖子,我认为这是一个很好的起点!

我的想法是迭代文件中的行,然后:

while read row; do echo ${row} | python -mjson.tool; done < "file_name"

还有人有其他想法吗?

【问题讨论】:

  • 您可以使用cat somefile.json | jq . 来漂亮地打印文件(假设您安装了 jq)。
  • 重要的是要注意,OP “JSON”但实际上是指换行分隔的 JSON (NDJSON),顶级对象之间没有逗号。 (这在基于 JSON 的日志框架中很常见。)

标签: json shell command-line


【解决方案1】:

jq - 轻量级且灵活的命令行 JSON 处理器

当我花了比它应该发现的时间更长的时间时,我觉得这应该有自己的条目。我正在寻找一种简单的方法来漂亮地打印docker inspect -f 的 json 输出。 Noufal Ibrahim 在上面简要提到了它作为另一个答案的一部分。

来自jq网站(https://stedolan.github.io/jq/):

jq 就像用于 JSON 数据的 sed - 您可以使用它来切片、过滤、映射和转换结构化数据,就像 sed、awk、grep 和朋友让您玩文本一样容易。

它默认提供彩色输出,您只需通过管道传输到jq,例如

jq . < file

示例:

"Raw" json outputthe same piped to jq

【讨论】:

  • 勘误:管道到 jq '.'因为 jq 需要这个最小指令
  • jq 具有更改缩进 --indent 2 和对对象 --sort-keys 中的键进行排序的选项(这在将 JSON 检入存储库时非常有用,因为这样差异会提供更多信息)
【解决方案2】:

将文件中的结果通过管道传输到 python json 工具 2.6 及以后

python -m json.tool < 'file_name'

【讨论】:

  • 您知道如何对目录中的所有文件执行此操作吗?我还不习惯 bash 脚本。
  • alias ppjson="python -m json.tool" 添加到您的~/.profile 文件中,以避免下次您需要时再来这里
  • 这对我不起作用!!我得到Expecting property name: line 1 column 3 (char 2)。带有 4.4.0 内核的 Linux 上的 Python 2.7.16,安装了 pythonpython-cjson 软件包的 Debian buster。
【解决方案3】:

从 mac OS 10.15 终端我可以使用json_pp

echo '{ "element0" : "lorem", "element1" : "ipsum" }' | json_pp

【讨论】:

  • 出色的答案,希望我能投票更多!为我们做了诀窍。
【解决方案4】:

从命令行将 json 格式化为表格

您可以使用jtab - 一个用 rust 编写的工具 - 将任何 json 数据打印为表格。

例如:

➜ echo '{"foo": "bar"}' | jtab

+-----+
| foo |
+-----+
| bar |
+-----+

它也适用于 json 数组:

➜  echo '[{"id": "1", "name": "Rust"}, {"id": "2", "name": "Jtab"}]' | jtab

+----+------+
| id | name |
+----+------+
| 1  | Rust |
+----+------+
| 2  | Jtab |
+----+------+

【讨论】:

    【解决方案5】:

    我总是使用 json_reformat

    echo '{"test":"value", "test2":"value2"}' | json_reformat
    
    {
        "test": "value",
        "test2": "value2"
    }
    

    可以通过 apt-get install yajl 安装 甚至在 MobaXTerm 中的 Windows 下

    【讨论】:

      【解决方案6】:

      使用 python(2 和 3):

      alias prettify_json="python -c 'import sys ;import json ; print(json.dumps(json.loads(sys.stdin.read()), indent=4))'"
      

      或者用红宝石:

      alias prettify_json="ruby -e \"require 'json';puts JSON.pretty_generate(JSON.parse(STDIN.read))\""
      

      你可以使用:

      echo '{"bar": "abc", "foo": "def"}' | prettify_json
      
      curl http://.../file.json | prettify_json
      

      【讨论】:

        【解决方案7】:

        要使用正确的缩进格式化 JSON,请使用 JSON.stringify

        console.log(JSON.stringify(your_object, null, 2)); // prints in b/w
        

        但要通过添加颜色使其更漂亮,您可以查看我的包beautify-json

        beautify-json

        示例

        const { jsonBeautify } = require('beautify-json')
        
        let your_object = {
            name: 'Nikhil',
            age: 22,
            isMarried: false,
            girlfriends: null,
            interestedIn: [
                'javascript',
                'reactjs',
                'nodejs'
            ]
        }
        
        jsonBeautify(your_object) // It will beautify your object with colors and proper indentation and display it on the terminal
        

        输出

        【讨论】:

          【解决方案8】:

          在 Mac OS 中,使用命令安装jq

          $ brew install jq
          

          您可以获得类似的漂亮打印 JSON,

          $ curl -X GET http://localhost:8080/api/v1/appointments/1  | jq
          
          
            % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                           Dload  Upload   Total   Spent    Left  Speed
          100   117    0   117    0     0   8404      0 --:--:-- --:--:-- --:--:--  9000
          {
            "craeted_at": "10:24:38",
            "appointment_date": "2019-02-08",
            "name_of_doctor": "Monika",
            "status": true,
            "price": 12.5,
            "id": 1
          }
          

          【讨论】:

            【解决方案9】:

            您可以使用jq 软件包,该软件包可以安装在所有Linux 系统中。使用以下命令安装该工具。

            # Redhat based systems(Centos)
            yum install -y epel-release
            yum install -y jq
            
            # Debian based systems
            apt install -y jq
            

            然后您将能够将文本流通过管道传输到 jq 工具。

            echo '{"test":"value", "test2":"value2"}' | jq
            

            希望这个答案会有所帮助。

            【讨论】:

            • CentOS 7 需要epel-release
            【解决方案10】:

            您可以使用 Python JSON 工具(需要 Python 2.6+)。

            例如:

            echo '{ "element0" : "lorem", "element1" : "ipsum" }' | python -m json.tool
            

            这会给你:

            {
                "element0": "lorem",
                "element1": "ipsum"
            }
            

            【讨论】:

              【解决方案11】:

              使用 Pygmentize + Python json.tool 的彩色输出

              Pygmentize 是一个杀手锏。 See this.我把python json.tool和pygmentize结合起来

              echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g
              

              对于其他类似的工具和安装说明,请参阅上面链接的答案。

              这是一个现场演示:

              【讨论】:

              • 不错!我不知道pygmentize!但我必须先安装它,然后运行命令“....| pygmentize -l python”,你的命令“...| pygmentize -g”对我不起作用(漂亮的打印 json 但未染色)
              【解决方案12】:

              Shawn 的解决方案,但适用于 Python 3:

              echo '{"foo": "bar"}' | python3 -m json.tool
              

              【讨论】:

                【解决方案13】:

                他们有很多。我个人在我的.zshrc中有这个别名

                pjson () {
                        ~/bin/pjson.py | less -X
                }
                

                pjson.py 在哪里

                #!/usr/bin/env python
                
                import json
                import sys
                
                try:
                    input_str = sys.stdin.read()
                    print json.dumps(json.loads(input_str), sort_keys = True, indent = 2)
                except ValueError,e:
                    print "Couldn't decode \n %s \n Error : %s"%(input_str, str(e))
                

                允许我在命令行中将其用作管道(类似于curl http://.... | pjson)。

                OTOH,自定义代码是一种责任,所以有jq,对我来说这看起来像是黄金标准。它是用 C 语言编写的(因此可以移植,没有 Python 或 Node 等依赖项),不仅可以打印漂亮而且速度很快。

                【讨论】:

                • 这个解决方案也不错!
                • python 脚本很好,但为什么要先把它包装在一个 shell 函数中呢?
                • 所以解决方案是添加一个 bash 脚本,该脚本将运行一个只能在本地机器上运行的 python 脚本?
                • Jo So:我这样做是为了让寻呼机与-X 一起工作。有一个寻呼机很有用,但默认情况下,less 会清除屏幕和类似的不受欢迎的东西。
                • 答案中真正有价值的是jq。我认为它优于这个问题中的所有解决方案。
                猜你喜欢
                • 2013-04-12
                • 2016-02-06
                • 2012-10-08
                • 2015-01-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-10-03
                相关资源
                最近更新 更多