【问题标题】:How to indent JSON data inside of TextMate, Emacs, BBEdit, or Sublime Text 2?如何在 TextMate、Emacs、BBEdit 或 Sublime Text 2 中缩进 JSON 数据?
【发布时间】:2012-12-26 16:56:10
【问题描述】:

[更新:在此问题发布 8 小时后,JSON bundle 的作者收到了该问题的通知并修复了该问题。]

我在文件 application.json 中有以下 JSON 数据,显示在本文末尾,我使用 TextMate 和 JSON bundle、Emacs、BBEdit 和 Sublime Text 2 来正确缩进它,但所有好像他们做不到。

TextMate 和 Sublime Text 2 都坚持第一个 { 不应该缩进,第一个主要问题是 "child": { 的右大括号。 TextMate 和 Sublime Text 2 都拒绝在"child": { 的左侧下方对齐}。 Emacs 不断为每一行进一步缩进,而 BBEdit 似乎根本没有重新缩进功能(可能是这个吗?)。

有没有办法正确缩进文件,或者 TextMate 和 Sublime Text 2 都在为 JSON 数据做正确的事情?

[ 
{
    "settings": [ "master" ],
    "appPort": "8666",
    "specs": {
        "frame" : {
            "type" : "HTMLFrameMojit",

            "config": {
                "deploy": true,
                "child": {
                    "type" : "HelloWorldMojit"
                    },
                    "assets": {
                        "top": {
                            "css": [
                            "/static/HelloWorldMojit/assets/index.css"
                            ]
                        }
                    }
                }
            }
        }
        },
        {
            "settings": [ "environment:development" ],
            "staticHandling": {
                "forceUpdate": true
            }
        }
        ]

【问题讨论】:

    标签: json emacs textmate sublimetext2 bbedit


    【解决方案1】:

    found BBEdit 的解决方案很简单,效果很好。

    将以下脚本放入
    ~/Library/Containers/BBEdit/Data/Library/Application Support/BBEdit/Text Filters/FormatJSON.sh(在 MacOS 11 Big Sur 或更高版本上)

    对于 MacOS 10.15 Catalina 及更低版本,请使用此位置:~/Library/Application Support/BBEdit/Text Filters/FormatJSON.sh

    #!/bin/bash
    python -m json.tool
    
    1. 在 BBEdit 中打开一个 JSON 文件。无需重启 BBEdit,因为 BBEdit 非常棒!
    2. 选择 文本 > 应用文本过滤器 > FormatJSON

    我使用一个单行包含 3,612,683 个字符的 JSON 文件对此进行了测试。 BBEdit 打开此文件并重新格式化,但未显示“Spinning Beachball of Death”忙等待鼠标光标。

    【讨论】:

    • Text Filters 和 FormatJSON 之间应该有另一个 /。
    • AppCode 内置了对 JSON 的支持,应该重新格式化它,但我没试过,而且价格不便宜。
    • 请注意,这可能会重新排序文件,而不仅仅是重新缩进。
    【解决方案2】:

    我刚刚更正了捆绑包中的这个问题,对于 2.0 用户,捆绑包应在 24 小时内更新并进行更正。

    【讨论】:

      【解决方案3】:

      解决方案 1:使用Python

      这个答案类似于this 答案,除了我使用python file 来做JSON 格式。

      1. 退出bbedit应用如果它是打开的,
      2. 将以下脚本pretty-json.py 放入~/Library/Application\ Support/BBEdit/Text\ Filters/ 路径中
      #!/usr/bin/env python
      # You can change above she-bang line depending on your Mac configuration
      
      import sys
      import json
      
      def main():
          input = sys.stdin.read()
          try:
              obj = json.loads(input)
          except Exception as e:
              print input + "\n\nERROR: " + str(e)
              return 1
          print(json.dumps(obj, indent=2))
          return 0
      
      if __name__ == '__main__':
          sys.exit(main())
      
      1. 要进行测试,请在 BBEdit 中打开一个 JSON 文件。

      2. 选择Text --> Apply Text Filter --> pretty-json.py

      3. 如果您遇到格式错误等问题,则上述脚本将在新文件中添加错误,并且不会更改原始 JSON。
        this 答案并非如此

      参考:https://gist.github.com/brokaw/95ade1358954cd97d0f2c8e992e14b08

      更多信息:参考this

      上述过滤器适用于较小的 JSON 文件,但如果 JSON 文件很大(~ 40MB),那么格式化会很慢。

      要解决这个问题,请使用以下解决方案

      解决方案 2:使用jq

      为了更快的 json 格式化,

      1. 安装jqbrew install jq
      2. 在与上述文件位置相同的位置添加fast-json-pretty.sh文件
      3. 重新启动 bbedit。
      #!/bin/bash
       jq
      

      【讨论】:

        【解决方案4】:

        根据http://jsonprettyprint.com/,Textmate 和 Sublime 的做法不正确。

        您使用的是哪个版本的 Emacs?

        在 24.2.1 中,您的 JSON blob 在 js-mode(Emac 的默认 javascript 主模式)中完美缩进,没有问题。


        如果您进行任何重要的 Javascript 开发,我建议您检查 js2-mode https://github.com/mooz/js2-mode,它将 Emacs 变成一个出色的 JS IDE。

        【讨论】:

        • 我在 Fedora (Emacs 24.1.1) 上试用了最新的 Emacs,它运行良好,那么问题来了,Mac 上的 Emacs 如何升级? (更新:我的 Emacs 在 OS X Lion 上是 22.1.1,按照 GitHub 上 js2-mode 的说明,它不会将 js2-mode 添加到 Emcas)
        【解决方案5】:

        崇高的漂亮 JSON

        Sublime Pretty JSON 将第一个 { 缩进。 这是我得到的:

        [
          {
            "settings": [
              "master"
            ],
            "appPort": "8666",
            "specs": {
              "frame": {
                "type": "HTMLFrameMojit",
                "config": {
                  "deploy": true,
                  "child": {
                    "type": "HelloWorldMojit"
                  },
                  "assets": {
                    "top": {
                      "css": [
                        "/static/HelloWorldMojit/assets/index.css"
                      ]
                    }
                  }
                }
              }
            }
          },
          {
            "settings": [
              "environment:development"
            ],
            "staticHandling": {
              "forceUpdate": true
            }
          }
        ]
        

        安装

        在 Sublime Text 2 中:Preference => Package Control => Install Package => "Pretty Json" => Restart Sublime => Select JSON Text => Press:

        • Linux: ctrl+alt+j
        • Windows:ctrl+alt+j
        • OS X: cmd+ctrl+j

        【讨论】:

          【解决方案6】:

          这是一个简单地使用 Google Chrome 或 NodeJS 本身的解决方案,方法如下:

          只需打开 Google Chrome 开发工具或 NodeJS 提示符,然后输入

          obj = 
          

          并将对象复制并粘贴到其中,所以它会像

          obj = [
                { 
                  // etc
          

          现在,在 Google Chrome 中,只需键入

          JSON.stringify(obj, null, 4)
          

          您将获得格式化的 JSON。在 NodeJS 中,由于它会逐字打印出\n,因此您可以使用

          console.log(JSON.stringify(obj, null, 4))
          

          如果您希望缩进只有 2 个空格,只需使用 2 而不是 4

          如果您希望缩进是制表符而不是空格,只需使用

          JSON.stringify(obj, null, "\t")
          

          【讨论】:

            【解决方案7】:
            1. ~/Library/Application\ Support/BBEdit/Text\ Filters/ 中创建脚本文件fast-json-pretty.sh
            2. 插入以下脚本:
            #!/usr/bin/env bash
            /usr/local/bin/jq .
            
            1. 按如下方式应用文本过滤器:Menu bar --> Text --> Apply Text Filter --> fast-json-pretty

            这是 DKB 的 JQ 脚本版本的重新设计版本,因为至少对我而言,它需要完整路径和末尾的点 (.) 才能完成这项工作。

            【讨论】:

              猜你喜欢
              • 2013-03-23
              • 2012-03-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多