Como formatar o arquivo JSON no Vim

27

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?

ljs.dev
fonte
1
Post relacionado do StackOverflow: Como corrigir o recuo do JSON no vim?
Peter Rincker

Respostas:

47

Ou você pode instalar o jqque é mais rápido (escrito em C) a partir do seu gerenciador de pacotes (por exemplo, sudo apt install jqno Ubuntu / Debian, sudo dnf install jqno Fedora / RHEL / CentOS) ou da fonte e, em seguida, no vim, digite:

:%!jq .
SebMa
fonte
1
:%!jqfunciona tão bem para mim.
Micks Ketches
3
Hum ... só funciona com o adicionado .para mim. Eu quero saber porque.
Costa
29

Este one-liner funciona bem para formatar JSON no Vim em uma forma legível por humanos:

:%!python -m json.tool

ljs.dev
fonte
1
Você memoriza isso e digita todas as vezes ou usa algum tipo de apelido?
asedsami
Eu costumo usar a :%!jq .resposta hoje em dia, como faço menos com Python e costumo ter jqinstalado 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 jqsolução agora é a minha preferida.
Ljs.dev 14/12/19
(resposta aceita atualizada para refletir isso)
ljs.dev 14/12/19
3
Apenas um aviso de que isso escapará alguns caracteres apenas no ASCII. Portanto, se você deseja codificar UTF8 jq, é a melhor opção.
AndrewHarvey
5

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()
Prajit Patil
fonte
Bem-vindo ao Vi e Vim ! Ótima primeira resposta; é interessante considerar o aspecto da classificação!
D. Ben Knoble
Sobre a classificação que tenho certeza jqmencionado nas respostas do SebMa, há uma --sort-keysopção que faria o trabalho. Mas é legal para escrever sua própria implementação também :)
statox
1

Se o PHP estiver disponível, adicione a ferramenta jfcomo 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>
Lei Fan
fonte
1

Eu uso esse :Jsonfcomando. É 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)))"'
han xi
fonte