[英]How to detect and indent json substrings inside longer non-json text?
[英]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
我用一个单行有 3,612,683 个字符的 JSON 文件对此进行了测试。 BBEdit 打开此文件并重新格式化,但未显示 SPOD。
我刚刚在捆绑包中更正了这个问题,对于 2.0 用户,捆绑包应该在 24 小时内更新并进行更正。
解决方案 1:使用Python
这个答案类似于这个答案,除了我使用python file
来做 JSON 格式。
bbedit
应用程序打开,则退出它,~/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())
要进行测试,请在 BBEdit 中打开一个 JSON 文件。
选择Text
--> Apply Text Filter
--> pretty-json.py
如果您遇到格式错误等任何问题,则上述脚本将在新文件中添加错误,并且不会更改原始 JSON。
这个答案不是这种情况
参考:https ://gist.github.com/brokaw/95ade1358954cd97d0f2c8e992e14b08
有关更多信息:请参阅此
上述过滤器适用于较小的 JSON 文件,但如果 JSON 文件很大(约 40MB),则格式化会很慢。
要解决此问题,请使用以下解决方案
解决方案2:使用jq
为了更快的 json 格式,
brew install jq
fast-json-pretty.sh
文件#!/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。
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 => 按:
这是一个简单地使用 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")
~/Library/Application\\ Support/BBEdit/Text\\ Filters/
创建一个脚本文件fast-json-pretty.sh
#!/usr/bin/env bash
/usr/local/bin/jq .
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.