11

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

我在一个文件中有以下 JSON 数据application.json,显示在这篇文章的末尾,并且我使用了带有JSON 包、Emacs、BBEdit 和 Sublime Text 2 的 TextMate 来正确缩进它,但似乎它们都不能。

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
            }
        }
        ]
4

7 回答 7

33

找到了一个简单且运行良好的 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”忙等待鼠标光标。

于 2013-10-17T14:26:11.840 回答
4

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

于 2013-01-12T10:48:19.690 回答
3

解决方案 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
于 2019-02-08T08:23:57.263 回答
2

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

于 2013-01-12T03:39:45.210 回答
0

崇高漂亮的 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 中:首选项 => 包控制 => 安装包 => “Pretty Json” => 重新启动 Sublime => 选择 JSON 文本 => 按:

  • Linux: ctrl+alt+j
  • 窗口:ctrl+alt+j
  • OS X:cmd+ctrl+j
于 2015-04-22T07:23:10.030 回答
0

这是一个简单地使用 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")
于 2020-12-27T11:43:13.743 回答
0
  1. fast-json-pretty.sh在中创建一个脚本文件~/Library/Application\ Support/BBEdit/Text\ Filters/
  2. 插入以下脚本:
#!/usr/bin/env bash
/usr/local/bin/jq .
  1. 按如下方式应用文本过滤器:Menu bar--> Text--> Apply Text Filter-->fast-json-pretty

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

于 2021-06-30T07:05:54.977 回答