So formatieren Sie JSON-Dateien in Vim

26

Gegeben eine Datei mit einem großen JSON-Objekt alle in einer Zeile wie

{"versions":[{"count":2,"version":""},{"count":1,"version":"1.1.1"},{"count":14,"version":"2.9"},{...

Wie kann ich dies so formatieren, dass es in Vim für Menschen lesbar ist?

ljs.dev
quelle
1
In Verbindung stehender StackOverflow-Beitrag: Wie behebt man den JSON-Einzug in vim?
Peter Rincker

Antworten:

45

Oder Sie können installieren, jqwas schneller (in C geschrieben) ist, von Ihrem Paketmanager (z. B. sudo apt install jqin Ubuntu / Debian, sudo dnf install jqunter Fedora / RHEL / CentOS) oder von der Quelle und dann in vim, geben Sie Folgendes ein:

:%!jq .
SebMa
quelle
1
:%!jqfunktioniert genauso gut für mich.
Micks Ketches
1
Hm ... funktioniert nur mit dem .für mich hinzugefügten . Ich wundere mich warum.
Costa
27

Dieser Einzeiler funktioniert gut, um JSON in Vim in eine für Menschen lesbare Form zu formatieren:

:%!python -m json.tool

ljs.dev
quelle
1
Merken Sie sich das und geben Sie es jedes Mal ein oder verwenden Sie einen Alias?
Asedsami
Ich verwende :%!jq .heutzutage eher die Antwort, da ich weniger mit Python mache und jqauf meinen Systemen für jede JSON-Arbeit in CLI installiert habe. Ich bekomme auch ziemlich oft Benachrichtigungen für diese SO-Frage, daher hilft es mir nicht zu vergessen: PI bevorzugt vim mit minimalen Anpassungen, ohne Plugins usw., was ein weiterer Grund ist, warum die jqLösung jetzt meine bevorzugte ist.
ljs.dev
(aktualisierte akzeptierte Antwort, um dies widerzuspiegeln)
ljs.dev
3
Nur eine Warnung, dass dadurch nur einige Zeichen in ASCII entkommen. Wenn Sie also eine UTF8-Codierung wünschen, ist jq die bessere Option.
Andrew Harvey
4

Um deterministisch zu formatieren, müssen wir den Hash sortieren. Keine der anderen Antworten hat das für mich getan, also habe ich meine eigene erstellt:

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

Verwendungszweck:

:call FormatJson()
Prajit Patil
quelle
Willkommen bei Vi und Vim ! Schöne erste Antwort; Es ist interessant, dass Sie den Sortieraspekt berücksichtigen!
D. Ben Knoble
Über die Sortierung, von der ich ziemlich sicher bin, dass jqsie in SebMa-Antworten erwähnt wird, gibt es eine --sort-keysOption, die den Job erledigen würde. Aber es ist cool, auch eine eigene Implementierung zu schreiben :)
statox
1

Wenn PHP verfügbar ist, fügen Sie das Tool jfals JSON-Formatierer von Composer hinzu:

$ composer global require codegear/json-formatter

Dann aktuelle Datei formatieren:

:%!jf %

Oder fügen Sie eine Keymap in vimrc hinzu:

nnoremap <Leader>jf :%!jf %<CR>
Lei Fan
quelle
1

Ich benutze diesen :JsonfBefehl. Es kann Unicode formatieren.

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
quelle