Dado um arquivo com um grande objeto JSON, tudo em uma linha como
{"versions":[{"count":2,"version":""},{"count":1,"version":"1.1.1"},{"count":14,"version":"2.9"},{...
Como posso formatar isso para ser legível por humanos no Vim?
Dado um arquivo com um grande objeto JSON, tudo em uma linha como
{"versions":[{"count":2,"version":""},{"count":1,"version":"1.1.1"},{"count":14,"version":"2.9"},{...
Como posso formatar isso para ser legível por humanos no Vim?
Respostas:
Ou você pode instalar o jq
que é mais rápido (escrito em C) a partir do seu gerenciador de pacotes (por exemplo, sudo apt install jq
no Ubuntu / Debian, sudo dnf install jq
no Fedora / RHEL / CentOS) ou da fonte e, em seguida, no vim, digite:
:%!jq .
:%!jq
funciona tão bem para mim.
.
para mim. Eu quero saber porque.
Este one-liner funciona bem para formatar JSON no Vim em uma forma legível por humanos:
:%!python -m json.tool
:%!jq .
resposta hoje em dia, como faço menos com Python e costumo ter jq
instalado nos meus sistemas para qualquer trabalho JSON na CLI. Também recebo notificações para essa pergunta SO com bastante frequência, o que me ajuda a não esquecer: o PI prefere o vim com personalização mínima, sem plugins etc., que é outro motivo pelo qual a jq
solução agora é a minha preferida.
Para formatar de forma determinística, precisamos classificar o hash. Nenhuma das outras respostas fez isso por mim, então criei as minhas:
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
Uso:
:call FormatJson()
jq
mencionado nas respostas do SebMa, há uma --sort-keys
opção que faria o trabalho. Mas é legal para escrever sua própria implementação também :)
Se o PHP estiver disponível, adicione a ferramenta jf
como um JSON Formatter by Composer:
$ composer global require codegear/json-formatter
Formate o arquivo atual:
:%!jf %
Ou adicione um mapa de teclas no vimrc:
nnoremap <Leader>jf :%!jf %<CR>
Eu uso esse :Jsonf
comando. É pode formatar 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)))"'