Dato un file con un grande oggetto JSON tutto su una riga come
{"versions":[{"count":2,"version":""},{"count":1,"version":"1.1.1"},{"count":14,"version":"2.9"},{...
Come posso formattare questo per essere leggibile dall'uomo in Vim?
Dato un file con un grande oggetto JSON tutto su una riga come
{"versions":[{"count":2,"version":""},{"count":1,"version":"1.1.1"},{"count":14,"version":"2.9"},{...
Come posso formattare questo per essere leggibile dall'uomo in Vim?
Risposte:
Oppure puoi installare quello jq
che è più veloce (scritto in C) dal tuo gestore di pacchetti (ad esempio sudo apt install jq
in Ubuntu / Debian, sudo dnf install jq
su Fedora / RHEL / CentOS) o dal sorgente e poi in vim, digita:
:%!jq .
:%!jq
funziona altrettanto bene per me.
.
per me. Mi chiedo perché.
Questo one-liner funziona bene per formattare JSON in Vim in una forma leggibile dall'uomo:
:%!python -m json.tool
:%!jq .
risposta in questi giorni, poiché faccio meno con Python e tendo ad averlo jq
installato sui miei sistemi per qualsiasi lavoro JSON in CLI. Ricevo anche notifiche per questa domanda SO abbastanza spesso, quindi mi aiuta a non dimenticare: PI preferisco vim con personalizzazione minima, nessun plug-in, ecc., Un'altra ragione per cui la jq
soluzione è ora la mia preferita.
Per formattare in modo deterministico, dobbiamo ordinare l'hash. Nessuna delle altre risposte lo ha fatto per me, quindi ho creato il mio:
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
nelle risposte SebMa sia presente --sort-keys
un'opzione che farebbe il lavoro. Ma è bello anche scrivere la tua implementazione :)
Se PHP è disponibile, aggiungi lo strumento jf
come JSON Formatter di Composer:
$ composer global require codegear/json-formatter
Quindi formatta il file corrente:
:%!jf %
Oppure aggiungi una keymap in vimrc:
nnoremap <Leader>jf :%!jf %<CR>
Io uso questo :Jsonf
comando. Può formattare 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)))"'