繁体   English   中英

如何在 TextMate、Emacs、BBEdit 或 Sublime Text 2 中缩进 JSON 数据?

[英]How to indent JSON data inside of TextMate, Emacs, BBEdit, or Sublime Text 2?

[更新:这个问题发布 8 小时后, JSON 包的作者收到了这个问题的通知,他修复了它。]

我在文件application.json中有以下 JSON 数据,显示在本文末尾,我使用 TextMate 和JSON bundle 、Emacs、BBEdit 和 Sublime Text 2 来正确地缩进它,但一切似乎都无法做到't。

TextMate 和 Sublime Text 2 都坚持第一个{不应该缩进,第一个主要问题是"child": { TextMate 和 Sublime Text 2 都拒绝将}对齐到"child": { Emacs 继续为每一行进一步缩进,BBEdit 似乎根本没有重新缩进 function(这可能是吗?)。

有没有办法正确缩进文件,或者 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
            }
        }
        ]

找到了一个简单且运行良好的 BBEdit 解决方案。

将以下脚本放入
~/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 打开此文件并重新格式化,但未显示 SPOD。

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

解决方案 1:使用Python

这个答案类似于这个答案,除了我使用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。
    这个答案不是这种情况

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

有关更多信息:请参阅

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

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

解决方案2:使用jq

为了更快的 json 格式,

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

在 BBEdit 14.0 及更高版本中,文本菜单上的“Reformat Document”将重排 JSON。您还可以使用支持重新格式化的 JSON 语言服务器支持内置语言服务器。

根据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。

崇高漂亮的 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 => 选择 JSON Text => 按:

  • Linux:ctrl+alt+j
  • 视窗:ctrl+alt+j
  • OS X:cmd+ctrl+j

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

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

obj = 

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

obj = [
      { 
        // etc

现在,在谷歌浏览器中,只需输入

JSON.stringify(obj, null, 4)

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

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

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

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

JSON.stringify(obj, null, "\t")
  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

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

只需检查安装了哪个版本的 python:

仅当 python 解释器安装在被调用的 shell 中时,使用 json_pretty 才有效。 例如,我的 json_pretty 有效,我在 Ventura 上对其进行了如下修改:

#!/bin/zsh
python3 -m json.tool

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM