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

z9zf31ra  于 2022-11-26  发布在  Mac
关注(0)|答案(8)|浏览(363)

[**更新:**在此问题发布8小时后,JSON bundle的作者收到了此问题的通知,并修复了此问题。]
我在一个文件application.json中有下面的JSON数据,在这篇文章的结尾显示,我已经使用JSON bundle、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
            }
        }
        ]
vm0i2vca

vm0i2vca1#

    • EDIT:对于BBEdit,使用Siegel建议的"文本"〉"重新格式化文档"**
  • 原始回复:*

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太棒了!
1.选择文本〉应用文本过滤器〉格式JSON
我用一个每行包含3,612,683个字符的JSON文件进行了测试,BBEdit打开了这个文件并重新格式化,没有显示"死亡旋转沙滩球"忙碌等待鼠标光标。

dauxcl2d

dauxcl2d2#

解决方案1:使用Python
这个答案类似于this的答案,只是我使用python file来处理JSON格式。
1.如果bbedit应用程序已打开,则退出该应用程序,
1.将以下脚本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文件。
1.选择Text--〉Apply Text Filter--〉pretty-json.py
1.如果遇到格式错误等问题,上述脚本将在New file中添加错误,并且不会更改原始JSON。
this的情况并非如此
参考:https://gist.github.com/brokaw/95ade1358954cd97d0f2c8e992e14b08
如需更多信息:参考this
上述过滤器适用于较小的JSON文件,但如果JSON文件较大(~ 40 MB),则格式化速度会很慢。
要解决此问题,请使用以下解决方案
解决方案2:使用jq
为了更快地格式化json,
1.安装jqbrew install jq
1.检查您是否能够在终端中执行jq,或者需要完整路径,添加以下文件中的任何工作项来代替jq
1.在~/Library/Application\ Support/BBEdit/Text\ Filters/位置添加fast-json-pretty.sh文件
1.重新启动bbedit。

#!/bin/bash
jq
prdp8dxp

prdp8dxp3#

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

qlvxas9a

qlvxas9a4#

在BBEdit 14.0及更高版本中,文本菜单上的“重新格式化文档”将重新格式化JSON。您也可以使用内置的Language Server Support和支持重新格式化的JSON语言服务器。

g52tjvyc

g52tjvyc5#

根据http://jsonprettyprint.com/的说法,Textmate和Sublime没有做正确的事情。
您使用的是哪个版本的Emacs?
在24.2.1中,您的JSON blob在js-mode(Emac的默认javascript主模式)中完美地缩进,没有任何问题。
如果您要进行任何重要的Javascript开发,我建议您查看js 2-mode https://github.com/mooz/js2-mode,它将Emacs转变为一个很棒的JS IDE。

dw1jzc5e

dw1jzc5e6#

精致漂亮的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
    }
  }
]

安装

在崇高文本2中:首选项=〉包控制=〉安装包=〉“Pretty Json”=〉重新启动Sublime =〉选择JSON文本=〉按下:

  • Linux:Ctrl+Alt+j
  • 窗口:Ctrl+Alt+j
  • OS X:命令+Ctrl+j
moiiocjp

moiiocjp7#

这是一个简单地使用谷歌Chrome或NodeJS本身的解决方案,下面是如何:
只需打开Google Chrome开发工具或NodeJS提示符,然后输入

obj =

复制并粘贴对象,这样就像

obj = [
      { 
        // etc

现在,在Google Chrome浏览器中,只需输入

JSON.stringify(obj, null, 4)

在NodeJS中,由于它会一字不差地打印出\n,所以您可以使用

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

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

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

uhry853o8#

1.在~/Library/Application\ Support/BBEdit/Text\ Filters/中创建脚本文件fast-json-pretty.sh
1.插入以下脚本:

#!/usr/bin/env bash
/usr/local/bin/jq .

1.按如下方式应用文本过滤器:一个月两个月一个月--〉一个月三个月一个月--〉一个月四个月一个月--〉一个月五个月一个月
这是DKB的JQ脚本版本的重新工作版本,因为至少对我来说,它需要完整的路径和结尾的一个点(.)才能正常工作。

相关问题