最近和同事对接的过程中,同事发过来了一个json,这个json足足有1M~2M这么大,使用vim打开了之后,看着密密麻麻的花括号,方括号,着实有点抓狂。
好在有Vim神器在手,万行json也能轻松阅读。
Step 1. 格式化
json的格式化工具还是非常多的,看了下Neoformat插件里的配置,足足有5种可选的工具:
function! neoformat#formatters#json#enabled() abort
return ['jsbeautify', 'prettydiff', 'prettier', 'jq', 'fixjson']
endfunction
可是当我使用Neoformat命令时,得到的却是:
Neoformat: no change necessary
好吧,默认的配置居然不管用。只能自己动手配置了。
let g:neoformat_json_python = {
'exe': "python",
'args': ['-m', 'json.tool']
}
let g:neoformat_enabled_json = ['python']
这里直接使用python提供的格式化工具。如果使用了SpaceVim的话,启用format layer之后,那么使用[SPC]bf 快捷键,就可以格式化了。格式化之后,果然赏心悦目了不少。但是由于json的行数实在太多,想要找到想要的数据还是不太容易。
[Update: 对中文的支持] 今天发现如果原始的json中包含中文的话,格式化之后中文会以u开头的字符显示。深挖之后,发现是因为python -m json.tool中没有处理unicode字符,全部使用str来输出。这个还是挺违反直觉的,毕竟python3的一大变更就是将unicode和str区分开来,标准库中json模块居然没有跟进。解决这个问题也很简单,既然python不支持,那就换成json_pp来处理就好了。json_pp在各大发行版似乎都默认安装了,添加一下配置即可:
let g:neoformat_json_jsonpp = {
'exe': "json_pp",
'args': ['-json_opt', 'utf8,pretty'],
'stdin': 1
}
let g:neoformat_enabled_json = ['jsonpp']
Step 2. 折叠
格式化之后的json是有很好的缩进和层级的,因此使用vim默认的折叠功能,就能把不重要的信息折叠起来了。先来介绍下常用的折叠快捷键:
- zM: 折叠所有层级
- zc: 折叠当前行所在的内容
- zO: 打开当前折叠的所有层级
- zo:打开当前折叠
首先,设置折叠方式为indent。
set foldmethod=indent
然后只要简单地使用zM折叠所有层级,然后用zo一层一层打开,就可以很清晰地浏览json的结构了。
![9ce09e510fd7b45386cde6bc9068db74.png](https://img-blog.csdnimg.cn/img_convert/9ce09e510fd7b45386cde6bc9068db74.png)
其他注意事项
json虽然灵活方便,但是过多使用也是会带来很多问题的。因为太灵活,所以可能就有非常多的代码来处理边界输入,以及做错误处理。另外,在机器学习领域,json不适合作为数据集的格式,因为数据量大的时候,需要完全load进来,才能解析,这样很浪费资源,而且不太容易并行处理。可读性也是一个问题,想要查看数据集中的某些样本的时候会不太直观。如果非要使用的话,可以把每个样本作为一个json,每行放一个样本,在json比较小的时候,也是可以的。