Como formatar o arquivo JSON no Vim


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 .

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


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()

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>

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)))"'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.