54 题: 如何在shell脚本中打印JSON?

在...创建的问题 Fri, Nov 9, 2018 12:00 AM

是否有(Unix)shell脚本以人类可读的形式格式化JSON?

基本上,我希望它能改变以下内容:

 
{ "foo": "lorem", "bar": "ipsum" }

...变成这样的东西:

 
{
    "foo": "lorem",
    "bar": "ipsum"
}
    
2760
  1. 2012-10-15 08:51:02Z
  2. 我在不久前推出了自己的: github.com/exhuma/braindump/tree/master/jsonformat 代码非常简单,使用python自己的json库,但我也添加了pygments以获得语法高亮。
    2012-11-09 13:40:39Z
  3. 偶然发现了这一点,但随后找到了 Json Pretty 我非常喜欢它。 Typekit在他们的API示例中使用它,因此它后面有一些klout ^^
    2012-11-21 14:42:28Z
  4. 这是一篇博客文章,总结了该主题中提到的一些最佳方法。对于那些喜欢tldr的人: link
    2013-03-08 06:56:18Z
  5. 警告: python -m json.tool 并不总是生成有效的JSON。 (提示:1e1000)
    2015-09-11 16:48:33Z
  6. 醇>
    30答案                              30 跨度>                         

    使用Python 2.6+,您可以这样做:

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

    或者,如果JSON在文件中,您可以执行以下操作:

     
    python -m json.tool my_json.json
    

    如果JSON来自互联网源,例如API,则可以使用

     
    curl http://my_url/ | python -m json.tool
    

    为了方便所有这些情况,您可以创建别名:

     
    alias prettyjson='python -m json.tool'
    

    为了更方便,可以通过更多的打字来准备它:

     
    prettyjson_s() {
        echo "$1" | python -m json.tool
    }
    
    prettyjson_f() {
        python -m json.tool "$1"
    }
    
    prettyjson_w() {
        curl "$1" | python -m json.tool
    }
    

    以上所有情况。你可以将它放在.bashrc中,它每次都可以在shell中使用。像prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'一样调用它。

        
    4104
    2018-08-28 04:40:09Z
    1. 您可以将其传输到pygmentize -l javascript以在命令行中获取语法颜色输出。 编辑:如果您安装了pygments,那就是。
      2011-12-03 03:24:14Z
    2. 一个很好的答案,我唯一要注意的是它 对输出的键进行排序 - 您可能需要注意这一点。
      2012-06-26 20:35:46Z
    3. 在myy .vimrc“nnoremap< f5>:%!python -m json.tool< CR>:w< CR>”
      2012-10-15 06:59:28Z
    4. 这似乎将Unicode字符转换为\uXXXX,这可能是一个缺点。
      2012-10-16 11:24:05Z
    5. 我创建了一个别名:alias pretty='python -mjson.tool | pygmentize -l json,以便我可以运行:command params | pretty。希望这可以帮助。 PS:是否有人设法将此扩展到a)删除我每次都看到的卷曲输出和/或b)不对json键进行排序;请让我知道,我将非常感谢。
      2015-02-25 17:42:53Z
    6. 醇>

    您可以使用: jq

    使用非常简单,效果很好!它可以处理非常大的JSON结构,包括流。你可以找到 他们的教程此处

    以下是一个例子:

     
    $ jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
    {
      "bar": "ipsum",
      "foo": "lorem"
    }
    

    或换句话说:

     
    $ echo '{ "foo": "lorem", "bar": "ipsum" }' | jq .
    {
      "bar": "ipsum",
      "foo": "lorem"
    }
    
        
    828
    2016-12-05 11:35:07Z
    1. 还有一个--sort-keys选项,在某些情况下有用。
      2014-11-04 01:17:09Z
    2. 使用curl:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
      2015-04-21 07:44:09Z
    3. 这个答案令人困惑,因为模糊不清&LT;&LT;&LT;运营商。为什么不直接使用echo '{ "foo": "lorem", "bar": "ipsum" }' | jq .
      2015-08-26 17:26:51Z
    4. “jq。”作为一个漂亮的打印机是很棒的,但它有一个警告:jq(直到并包括jq版本1.5)将改变非常大和非常小的数字的值,因为它将数值解析为IEEE 754 64位值。要检查您最喜欢的漂亮打印机是否存在相同问题,请尝试以下值:1e1000。请注意, python -mjson.tool 严重失败,因为它产生了Infinity,甚至不是JSON。
      2015-09-04 02:38:52Z
    5. @ Meekohi的另一种选择是“不必要地使用echo”。非常高兴找到了<<<运营商 - 正是我所寻找的。​​ div>
      2016-12-28 20:10:3​​6Z
      醇>

      我使用 JSON.stringify 的“space”参数在JavaScript中精美打印JSON

      示例:

       
      // Indent with 4 spaces
      JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, 4);
      
      // Indent with tabs
      JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, '\t');
      

      从带有Node.js的Unix命令行,在命令行上指定JSON:

       
      $ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
        '{"foo":"lorem","bar":"ipsum"}'
      

      返回:

       
      {
          "foo": "lorem",
          "bar": "ipsum"
      }
      

      从带有Node.js的Unix命令行,指定包含JSON的文件名,并使用四个空格的缩进:

       
      $ node -e "console.log(JSON.stringify(JSON.parse(require('fs') \
            .readFileSync(process.argv[1])), null, 4));"  filename.json
      

      使用烟斗:

       
      echo '{"foo": "lorem", "bar": "ipsum"}' | node -e \
      "\
       s=process.openStdin();\
       d=[];\
       s.on('data',function(c){\
         d.push(c);\
       });\
       s.on('end',function(){\
         console.log(JSON.stringify(JSON.parse(d.join('')),null,2));\
       });\
      "
      
          
      367
      2019-04-09 12:46:18Z
      1. 对于Node.js中的调试对象,您应该使用sys.inspect()而不是JSON.stringify()。原因如下: markhansen.co.nz/inspecting-with-json-stringify
        2011-08-11 18:05:45Z
      2. Downvoted。 OP是关于“* nix命令行脚本”的,这个答案是不同的上下文。
        2012-09-02 14:30:18Z
      3. @ danorton:可以通过node.js和其他类似解决方案从命令行使用JS。
        2012-09-17 20:08:38Z
      4. 不需要控制台:node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"也将结果输出到STDOUT。
        2014-11-05 16:26:18Z
      5. 文件名与stdin
        的脚本不同
        2016-02-17 13:39:02Z
      6. 醇>

      我写了一个工具,它拥有最好的“智能空白”格式化程序之一拉布勒。它比这里的大多数其他选项产生更可读,更简洁的输出。

      undercore-cli

      这就是“智能空白”的样子:

      我可能有点偏颇,但它是从命令行打印和操作JSON数据的一个很棒的工具。它使用起来非常友好,并提供广泛的命令行帮助/文档。这是一把瑞士军刀,我用它来完成1001个不同的小任务,以任何其他方式令人惊讶地烦恼。

      最新用例:Chrome,开发控制台,网络标签,全部导出为HAR文件,“cat site.har |下划线选择'.url' - outfmt text | grep mydomain”;现在我有一个按时间顺序排列的列表,列出了在我公司网站加载过程中提取的所有URL。

      漂亮的打印很简单:

       
      underscore -i data.json print
      

      同样的事情:

       
      cat data.json | underscore print
      

      同样的事情,更明确:

       
      cat data.json | underscore print --outfmt pretty
      

      这个工具是我目前的激情项目,所以如果您有任何功能要求,我很有可能会解决它们。

          
      329
      2017-11-15 23:44:26Z
      1. 我还更新了〜/.bash_profile以获得以下行:alias underscor ='underscore print --outfmt pretty'现在我可以做curl example.com/result.json | undercor并仍使用下划线表示其他格式
        2013-11-20 18:42:14Z
      2. 谢谢Dave!工具很好! alias pretty-json =“underrsore pretty”和卷曲输出赏心悦目
        2015-01-20 09:44:21Z
      3. 优秀的格式化工具,只需一个注释:将输出转发到文件(使用 -o 选项或使用&gt; )仅适用于下划线打印下划线漂亮保存一个插入了颜色格式标志的文件,如:[32m,[33m,[39m以及每个之前的一些不可打印,这使得JSON无效。但是,单独使用下划线打印不会向文件添加任何内容并完美地执行其格式化作业。
        2015-01-24 12:18:57Z
      4. 我喜欢jq,但这对于没有双引号键的“JSON”非常有用。
        2015-02-27 00:37:21Z
      5. @ DaveDopson感谢伟大的工具!试着和 jsonselect.org/#tryit 一起使用......
        2015-05-14 02:37:14Z
      6. 醇>

      我通常只是这样做:

       
      echo '{"test":1,"test2":2}' | python -mjson.tool
      

      并检索选择数据(在本例中为“test”的值):

       
      echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'
      

      如果JSON数据在文件中:

       
      python -mjson.tool filename.json
      

      如果您想使用身份验证令牌在命令行中使用curl一次性完成所有操作:

       
      curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool
      
          
      171
      2017-11-15 23:34:52Z
      1. python&gt; = 2.6 required
        2013-01-23 17:22:47Z
      2. 如果json应该直接来自http api,这也是python中实现的一个很好的工具: github.com/jkbr/httpie
        2013-11-07 12:51:40Z
      3. 如果您安装了节点(并且不介意YAML样式输出),还有这个包: rafeca.com/prettyjson 所以你可以用| prettyjson结束卷曲
        2015-02-16 09:47:57Z
      4. 如上所述,作为JSON漂亮打印机的 python -mjson.tool 的一个问题是它并不总是发出JSON 。例如。 1e1000变为Infinity(无论是使用python 2.x还是3.x)。 'jq。'总是生成JSON,但它不能保证非常大(或非常小的值)被完全保留。
        2015-09-04 02:54:25Z
      5. 醇>

      感谢J.F. Sebastian的非常有用的指示,这里有一个稍微增强的脚本,我想出来了:

       
      #!/usr/bin/python
      
      """
      Convert JSON data to human-readable form.
      
      Usage:
        prettyJSON.py inputFile [outputFile]
      """
      
      import sys
      import simplejson as json
      
      
      def main(args):
          try:
              if args[1] == '-':
                  inputFile = sys.stdin
              else:
                  inputFile = open(args[1])
              input = json.load(inputFile)
              inputFile.close()
          except IndexError:
              usage()
              return False
          if len(args) < 3:
              print json.dumps(input, sort_keys = False, indent = 4)
          else:
              outputFile = open(args[2], "w")
              json.dump(input, outputFile, sort_keys = False, indent = 4)
              outputFile.close()
          return True
      
      
      def usage():
          print __doc__
      
      
      if __name__ == "__main__":
          sys.exit(not main(sys.argv))
      
          
      85
      2015-07-21 16:38:44Z
      1. 当值加载到字典中时,顺序丢失:正常dict个对象没有定义的顺序。尝试json.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False),你会发现他们仍然被交换了。要修复它,请导入OrderedDictload,通过object_pairs_hook=OrderedDict
        2013-05-31 02:58:30Z
      2. 您可以使用以下命令将脚本更改为从标准输入读取:inputFile = sys.stdin。这可以让你把东西管道输送到脚本:curl http://somewhere.com/foo.json | pp_json.py
        2014-10-31 18:37:18Z
      3. 为了避免使用@ icktoofay的评论进行排序,请像这样导入OrderedDict:from collections import OrderedDict
        2015-09-22 09:30:21Z
      4. 谢谢@icktoofay。这允许我创建以下vim函数:com! FormatJSON %!python -c "from collections import OrderedDict; import sys; import json; j = json.load(sys.stdin, object_pairs_hook=OrderedDict); json.dump(j, sys.stdout, sort_keys=False, indent=4, separators=(',', ': '))"请注意,分隔符必须设置为(',',':')以避免添加尾随空格: bugs.python.org/issue16333
        2016-06-13 17:05:27Z
      5. 很棒的片段!我使用了sort_keys = True,因为我想用它来比较json文件,它就像一个魅力。
        2017-01-25 20:40:19Z
      6. 醇>

      使用 jq工具本地方式并不简单。

      例如:

       
      cat xxx | jq .
      
          
      73
      2017-11-16 00:36:12Z
      1. 警告:jq将数字编码为IEEE 754 64位浮点数,因此它们的表示可能会发生变化。非常小和非常大的数字的精度可能会丢失。要检查您最喜欢的漂亮打印机是否存在相同问题,请尝试以下值:1e1000。
        2017-10-20 07:23:37Z
      2. 或者简单地说:jq . file.json;而cat file.json | jq(没有过滤器.)也有效。 (在ubuntu /linux上;跨平台的ymmv)
        2017-12-01 07:33:36Z
      3. 醇>

      如果使用npm和Node.js,则可以执行npm install -g json,然后通过json传递命令。做json -h获得所有选项。它还可以拉出特定字段并使用-i为输出着色。

       
      curl -s http://search.twitter.com/search.json?q=node.js | json
      
          
      72
      2017-11-15 23:20:56Z
      1. 这是我最喜欢的答案。
        2017-09-06 21:37:29Z
      2. 醇>

      使用Perl,使用CPAN模块JSON::XS。它安装了一个命令行工具json_xs

      验证

       
      json_xs -t null < myfile.json
      

      将JSON文件src.json预处理为pretty.json

       
      < src.json json_xs > pretty.json
      

      如果您还没有json_xs,请尝试json_pp。 “pp”用于“纯perl” - 该工具仅在Perl中实现,没有绑定到外部C库(这是XS代表的,Perl的“扩展系统”)。

          
      68
      2017-02-03 18:14:09Z
      1. 似乎是Cygwin的标准!
        2012-05-15 11:16:41Z
      2. json_pp可以以相同的方式使用,并且很可能很容易安装在您的系统上(在Debian上它位于'perl'包中)。
        2013-12-06 09:42:11Z
      3. 仅供参考,在我的Mac OS X 10.9系统上,json_pp可自动使用。
        2014-05-13 03:38:15Z
      4. 或者,pp代表“漂亮的印刷品”..
        2016-12-06 20:37:36Z
      5. -t null给了我 null:不是有效的toformat ......但是让它脱颖而出。感谢。
        2017-03-04 20:53:40Z
      6. 醇>

      在* nix上,从stdin读取并写入stdout效果更好:

       
      #!/usr/bin/env python
      """
      Convert JSON data to human-readable form.
      
      (Reads from stdin and writes to stdout)
      """
      
      import sys
      try:
          import simplejson as json
      except:
          import json
      
      print json.dumps(json.loads(sys.stdin.read()), indent=4)
      sys.exit(0)
      

      将此文件放入文件中(我在 AnC 的答案之后将其命名为“prettyJSON”)在PATH和chmod +x中它,你很高兴。

          
      68
      2017-08-02 08:58:58Z
      1. 实际上,使用stdin /stdout更加灵活和简单。谢谢你指出来。
        2009-08-01 07:28:20Z
      2. 对于期望命名文件的程序,使用/dev /stdin,ditto for out和err。
        2010-08-04 21:08:50Z
      3. 2011-05-19 06:41:44Z
      4. fileinput.input()无法处理最后一次检查时没有换行的文件。
        2013-04-18 20:53:32Z
      5. stdin.read()无法停止...我怎么能阻止这个?
        2016-10-06 02:46:25Z
      6. 醇>

      JSON Ruby Gem与shell脚本捆绑在一起,以美化JSON:

       
      sudo gem install json
      echo '{ "foo": "bar" }' | prettify_json.rb
      

      脚本下载: gist.github.com/3738968

          
      64
      2012-09-17 19:59:03Z
      1. 请注意,此解决方案解码unicode“\uxxxx”转义序列,与使用json.tool的Python解码不同。但是,它似乎也有嵌套深度限制(nesting of 20 is too deep (JSON::NestingError))。
        2011-05-30 06:40:04Z
      2. 在Ubuntu上你可以做的
        sudo apt-get install ruby-json-pure而不是gem install
        2012-03-27 17:45:40Z
      3. ```eric-mbp:~ericstob $sudo gem install json密码:获取:json-1.7.3.gem(100%)构建本机扩展。这可能需要一段时间......安装成功安装了json-1.7.3 1 gem安装json-1.7.3的ri文档...为json-1.7.3安装RDoc文档... eric-mbp:~ericstob $prettify_json .rb -bash:prettify_json.rb:找不到命令
        2012-05-31 18:05:27Z
      4. 也许你可以发布prettify_json.rb的内容?
        2012-08-23 16:56:54Z
      5. 您可以下载脚本,将其移至~/bin文件夹(确保它在您的PATH中)重命名为prettify_json.rbppj并运行chmod +x ppj。现在你可以做一些像curl www.jsonsring.com/something.json | ppj
        这样的事情
        2012-10-02 14:39:08Z
      6. 醇>

      更新我现在按照另一个答案的建议使用jq。它在过滤JSON方面非常强大,但是,最基本的,也是一种非常棒的方式来打印JSON以供查看。

      jsonpp 是一款非常好的命令行JSON漂亮打印机。

      来自自述文件:

        

      漂亮的打印网络服务响应如下:

       
      curl -s -L http://<!---->t.co/tYTq5Pu | jsonpp
      
           

      并使磁盘上运行的文件变得漂亮:

       
      jsonpp data/long_malformed.json
      

      如果您使用的是Mac OS X,则可以使用brew install jsonpp。如果没有,您只需将二进制文件复制到$PATH中的某个位置即可。

          
      55
      2017-11-15 23:51:03Z
      1. 我尝试了jsonpp(过去成功使用)对一个巨大的文件(> 60MB)。我在5分钟后停了下来。我将它传输到python -mjson.tool(来自其他答案),花了10-20秒...
        2015-04-28 19:27:19Z
      2. 60MB的JSON?哇!我通常不处理那些大而有用的文件。感谢。
        2015-04-28 21:43:07Z
      3. 在我的ubuntu盒子里,我有一个json_pp - 它很好地格式化了json,尽管命名相似,我相信这是一个完全不同于jsonpp提到的项目这里
        2016-07-29 11:24:14Z
      4. 醇>

      尝试 pjson 。它有颜色!

      使用pip安装它:

      ⚡ pip install pjson

      然后将任何JSON内容传输到pjson

          
      51
      2017-11-15 23:49:58Z
      1. 它需要python-pip(sudo apt-get install python-pip)然后(sudo pip install pjson)颜色的巨大优势!
        2013-11-22 12:47:22Z
      2. 缺点是无法grep彩色输出。
        2013-11-22 12:54:36Z
      3. 醇>

      我就是这样做的:

       
      curl yourUri | json_pp
      

      非常好几十个代码并完成工作。

          
      49
      2017-11-15 23:55:41Z
      1. 在跟踪管道字符时尝试了最佳解决方案。
        2018-05-19 04:24:06Z
      2. Ubuntu服务器:如果您的生产机器安装非常有限,这可能是最佳选择,因为它默认安装在特定名称下。 Python通常以不同的方式安装(例如python3,python或根本不安装),具体取决于版本。
        2019-06-21 13:22:46Z
      3. 醇>
       
      $ echo '{ "foo": "lorem", "bar": "ipsum" }' \
      > | python -c'import fileinput, json;
      > print(json.dumps(json.loads("".join(fileinput.input())),
      >                  sort_keys=True, indent=4))'
      {
          "bar": "ipsum",
          "foo": "lorem"
      }
      

      注意:这不是 方式。

      在Perl中也一样:

       
      $ cat json.txt \
      > | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}), 
      >                                     {pretty=>1})'
      {
         "bar" : "ipsum",
         "foo" : "lorem"
      }
      

      注2: 如果你运行

       
      echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
      | python -c'import fileinput, json;
      print(json.dumps(json.loads("".join(fileinput.input())),
                       sort_keys=True, indent=4))'
      

      可读性很好的单词变为\uc编码

       
      {
          "D\u00fcsseldorf": "lorem", 
          "bar": "ipsum"
      }
      

      如果您的管道的其余部分将优雅地处理unicode并且您希望您的JSON也是人性化的,只需使用 ensure_ascii=False

       
      echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
      | python -c'import fileinput, json;
      print json.dumps(json.loads("".join(fileinput.input())),
                       sort_keys=True, indent=4, ensure_ascii=False)'
      

      你会得到:

       
      {
          "Düsseldorf": "lorem", 
          "bar": "ipsum"
      }
      
          
      42
      2016-09-18 23:08:18Z
      1. 实际上我也是这样做但是用javascript本身:)
        2008-12-09 08:55:14Z
      2. 在我所拥有的JSON模块版本中,to_json似乎不接受选项。但这有效:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
        2011-12-16 15:12:39Z
      3. Python示例可以简化。将JSON输出直接输入python -m json.tool会更容易。
        2014-03-17 02:28:17Z
      4. @ Dan:是的。有几个答案显示了json.tool个代码示例。 1.此版本允许您更改一些参数,例如,indent 2.在发布时(2008),仍然使用Python 2.4 不支持-mjson.tool
        2014-03-17 07:21:48Z
      5. 醇>

      我使用 jshon 来完成您所描述的内容。跑吧:

       
      echo $COMPACTED_JSON_TEXT | jshon
      

      您还可以传递参数来转换JSON数据。

          
      39
      2017-11-15 23:33:46Z
      1. 谢谢,jshon比使用python或ruby进行同样的任务快得多
        2012-06-13 22:45:57Z
      2. @ Alexander - 你需要多快的漂亮打印机?我在预装Python的OSx Lion上。使用python -mjson.tool我可以在0.1秒内打印出一个96KB的json文件 - jshon链接到的earthporn的json输出大约是24KB,我可以在0.08s内打印出来。 jshon对你来说快多快?
        2012-06-20 11:32:55Z
      3. 我正在使用1 + GB压缩(谁知道有多大的未压缩)JSON数据文件,所以我非常感谢jshon更快的建议。
        2013-04-22 20:48:36Z
      4. 醇>

      或者,使用Ruby:

       
      echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
      
          
      37
      2009-10-21 09:10:49Z
      1. 这给了我一个错误。你需要安装一些ruby json包吗?
        2010-01-06 12:09:10Z
      2. 是的,你需要JSON Ruby Gem:sudo gem install json
        2010-01-09 13:38:42Z
      3. 如果你碰巧在红宝石中已经只使用jj my_object
        2010-07-15 13:20:35Z
      4. @ MatSchaffer请注意,如果您使用JSON来使用自定义to_json方法序列化对象,则这不起作用; Kernel#jj只打印相同的数组和哈希值(或数字/字符串/布尔值)。
        2011-06-27 15:59:17Z
      5. 如果使用ARGF.read而不是gets,那就更好。
        2014-06-13 19:48:44Z
      6. 醇>

      查看 Jazor 。这是一个用Ruby编写的简单命令行JSON解析器。

       
      gem install jazor
      jazor --help
      
          
      36
      2011-01-25 18:35:20Z
      1. 这只是我还是这是唯一能够回答OP问题的建议?我来到这里寻找一个简单的命令,我可以管理curl的输出,这是唯一一个为我做的。
        2011-11-23 00:32:09Z
      2. 我喜欢它可以选择着色输出。使阅读更容易。
        2012-08-23 18:07:46Z
      3. ooh我也喜欢传递url的选项,因为我使用它来查看我的REST API的输出
        2012-08-23 18:11:17Z
      4. 醇>

      一个简单的bash脚本,用于漂亮的json打印

      json_pretty.sh

       
      #/bin/bash
      
      grep -Eo '"[^"]*" *(: *([0-9]*|"[^"]*")[^{}\["]*|,)?|[^"\]\[\}\{]*|\{|\},?|\[|\],?|[0-9 ]*,?' | awk '{if ($0 ~ /^[}\]]/ ) offset-=4; printf "%*c%s\n", offset, " ", $0; if ($0 ~ /^[{\[]/) offset+=4}'
      

      示例:

       
      cat file.json | json_pretty.sh
      
          
      32
      2019-04-28 11:42:53Z
      1. 感谢您的反馈。我今天刚刚写了这个脚本用于个人使用,它在我的情况下运行良好。我做了修复,现在它更小,没有这个问题。没有目标支持完全格式化,但我可以在必要时进行其他修复。
        2016-07-27 16:58:50Z
      2. 这只是我找到的工作答案。我有一个嵌入式Linux - 没有rubby,没有javascript,没有访问互联网下载python模块...我有一些不同的awk,不支持%*c表示法所以我将printf更改为c=0; while (c++<offset) printf " "; printf $0;。而且我的awk有不同的正则表达式转义,反斜杠在[]中不起作用。我将正则表达式更改为/^[[{]//[]}]/
        2016-10-06 10:21:35Z
      3. 这应该是被接受的,因为它是完全原生的,不需要第三方软件......
        2018-02-20 14:12:53Z
      4. @ Blag编辑后脚本看起来很破碎,请解释或更正。谢谢!
        2018-02-21 03:31:18Z
      5. @ EvgenyKarpov很好的捕获,不需要完全回滚,只是被错误删除的grep;)
        2018-02-21 06:47:52Z
      6. 醇>

      JSONLint 有一个 GitHub上的开源实现,可以在命令行上使用,也可以包含在Node.js项目中。

       
      npm install jsonlint -g
      

      然后

       
      jsonlint -p myfile.json
      

       
      curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less
      
          
      30
      2019-04-09 13:09:46Z
      1. 在我的系统上正常工作。感谢
        2018-04-30 08:07:44Z
      2. 醇>

      只需将输出管道输送到jq .

      示例:

       
      twurl -H ads-api.twitter.com '.......' | jq .
      
          
      29
      2017-02-03 18:17:36Z
      1. 答案很好@Ackshaey Singh,人们也可以轻松地将相同的内容重定向到文件中。例如cat <file_name.txt> | jq . > <output_name.txt>
        2016-10-07 21:50:42Z
      2. brew install jq如果您在Mac OS上。
        2016-10-14 16:38:56Z
      3. 不幸的是,使用jq .进行漂亮打印有一个潜在的缺点:所有现存版本的jq都坚持将JSON数字视为IEEE数字,所以精度容易丢失,例如对于非常大的整数。
        2016-10-21 06:00:37Z
      4. @ Pramit cat file |总是浪费一个过程;只做jq . <file_name.txt >output_name.txt(用文字<>个字符)。
        2017-01-31 13:08:40Z
      5. 醇>

      Pygmentize

      我将Python的json.tool与pygmentize结合起来:

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

      我的回答中列出了pygmentize的一些替代方法。

      这是一个现场演示:

          
      24
      2017-11-15 23:52:12Z
      1. 有时需要使用pygmentize -l json来获得颜色。
        2015-11-23 10:13:46Z
      2. 使用apt软件包python-pygments安装,即apt-get install python-pygments
        2018-01-05 11:56:02Z
      3. 醇>

      使用Perl,如果您从CPAN安装 JSON :: PP ,您将会获取 json_pp 命令。窃取B Bycroft

       
      [pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
      {
         "bar" : "ipsum",
         "foo" : "lorem"
      }
      

      值得一提的是,json_pp预先安装了Ubuntu 12.04(至少)和Debian预装/usr/bin/json_pp

          
      19
      2017-05-23 11:55:11Z 四>

      我建议使用JSON :: XS perl模块中包含的json_xs命令行实用程序。 JSON :: XS是一个用于序列化/反序列化JSON的Perl模块,在Debian或Ubuntu机器上你可以像这样安装它:

       
      sudo apt-get install libjson-xs-perl
      

      显然也可以在 CPAN 上找到。

      要使用它来格式化从URL获取的JSON,您可以使用curl或wget,如下所示:

       
      $ curl -s http://page.that.serves.json.com/json/ | json_xs
      

      或者这个:

       
      $ wget -q -O - http://page.that.serves.json.com/json/ | json_xs
      

      并格式化文件中包含的JSON,您可以这样做:

       
      $ json_xs < file-full-of.json
      

      要重新格式化为 YAML ,有些人认为这比JSON更具人性化:

       
      $ json_xs -t yaml < file-full-of.json
      
          
      19
      2017-11-15 23:32:38Z

      您可以使用此简单命令来实现结果:

       
      echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool
      
          
      18
      2019-04-09 13:22:26Z
      1. brew install jq
      2.  command + | jq
      3. (例如:curl localhost:5000/blocks | jq
      4. 享受!
      5. 醇>

            
      16
      2017-09-15 20:38:19Z

      jj 非常快,可以经济地处理巨大的JSON文档,不会弄乱有效的JSON号码,并且易于使用,例如

       
      jj -p # for reading from STDIN
      

       
      jj -p -i input.json
      

      它是(2018)仍然很新,所以也许它不会按照你期望的方式处理无效的JSON,但它很容易在主要平台上安装。

          
      15
      2018-08-02 15:06:53Z

      bat 是一个cat克隆,语法高亮:

      示例:

       
      echo '{"bignum":1e1000}' | bat -p -l json
      

      -p将输出不带标题,-l将明确指定语言。

      它具有JSON的着色和格式,并且会出现此评论中提到的问题: 如何在shell脚本中打印JSON?

          
      12
      2019-04-09 13:24:03Z

      使用以下命令安装yajl-tools:

      sudo apt-get install yajl-tools

      然后,

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

          
      11
      2012-11-23 13:50:23Z
      1. 太棒了。不需要其他语言/口译员,并且在包装回购中,不需要酿造!
        2014-06-21 14:15:40Z
      2. 醇>
      根据我的经验,

      yajl 非常好。我使用json_reformat命令通过在.json中添加以下行来在vim中打印.vimrc个文件:

       
      autocmd FileType json setlocal equalprg=json_reformat
      
          
      10
      2014-03-27 13:52:56Z
来源放置 这里