给定一个具有大JSON对象的文件,它们全部都放在一行上,例如

{"versions":[{"count":2,"version":""},{"count":1,"version":"1.1.1"},{"count":14,"version":"2.9"},{...

我该如何格式化它以便在Vim中可读?

评论

相关StackOverflow文章:如何在Vim中修复JSON缩进?

#1 楼

或者,您可以从软件包管理器(例如,Ubuntu / Debian中的jq,Fedora / RHEL / CentOS上的sudo apt install jq)或从源代码中安装速度更快(用C语言编写)的sudo dnf install jq,然后在vim中键入:

:%!jq .


评论


:%!jq对我也一样。

–米克斯·凯奇(Micks Ketches)
19/12/27在22:38



嗯...仅适用于添加的。为了我。我想知道为什么。

–Costa
20 Apr 15'23:02

在MacOS上,我需要。以及

–托马斯
20年6月14日在18:53

无需在Ubuntu / Debian 14+及更高版本上安装jq。

– logbasex
20-11-26在6:33

#2 楼

这种单行代码很好地将Vim中的JSON格式化为人类可读的格式:


评论


您是否记住并每次都键入它,还是使用某种别名?

– asedsami
19/12/13在17:05



我倾向于使用:%!jq。回答这些天,因为我很少使用Python,并且倾向于在我的系统上安装jq以便在CLI中进行任何JSON工作。我也经常收到有关该SO问题的通知,因此它可以帮助我不要忘记:P我更喜欢vim的定制最少,没有插件等,这是jq解决方案现在是我首选的另一个原因。

–ljs.dev
19/12/14在7:37

(更新的接受答案以反映这一点)

–ljs.dev
19/12/14在7:37

只是警告说,这只会将某些字符转义为ASCII。因此,如果您想对UTF8进行编码,jq是更好的选择。

–安德鲁·哈维(AndrewHarvey)
20-2-5的3:01

#3 楼

要以确定性的方式进行格式化,我们需要对哈希进行排序。没有其他答案对我有用,因此我创建了自己的答案:

function! FormatJson()
python << EOF
import vim
import json
try:
    buf = vim.current.buffer
    json_content = '\n'.join(buf[:])
    content = json.loads(json_content)
    sorted_content = json.dumps(content, indent=4, sort_keys=True)
    buf[:] = sorted_content.split('\n')
except Exception, e:
    print e
EOF
endfunction


用法:

:call FormatJson()


评论


欢迎来到Vi和Vim!好的第一答案;考虑排序方面很有趣!

– D. Ben Knoble♦
19年11月19日在15:26

关于排序,我很确定SebMa答案中提到的jq具有--sort-keys选项,可以完成此工作。但是也可以编写自己的实现也很酷:)

–statox♦
19年11月19日在16:23

#4 楼

如果PHP可用,则通过Composer将工具jf添加为JSON格式化程序: >
或在vimrc中添加键盘映射:

$ composer global require codegear/json-formatter


#5 楼

我使用此:Jsonf命令。可以格式化unicode。

command! Jsonf :execute '%!python -c "import json,sys,collections,re; sys.stdout.write(re.sub(r\"\\u[0-9a-f]{4}\", lambda m:m.group().decode(\"unicode_escape\").encode(\"utf-8\"),json.dumps(json.load(sys.stdin, object_pairs_hook=collections.OrderedDict), indent=2)))"'