Comment formater le fichier JSON dans Vim

27

Étant donné un fichier avec un grand objet JSON sur une seule ligne comme

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

Comment puis-je formater ceci pour qu'il soit lisible par l'homme dans Vim?

ljs.dev
la source
1
Article StackOverflow connexe: Comment corriger l'indentation JSON dans vim?
Peter Rincker

Réponses:

47

Ou vous pouvez installer jqce qui est plus rapide (écrit en C) à partir de votre gestionnaire de paquets (par exemple sudo apt install jqdans Ubuntu / Debian, sudo dnf install jqsur Fedora / RHEL / CentOS) ou à partir de la source , puis dans vim, tapez:

:%!jq .
SebMa
la source
1
:%!jqfonctionne aussi bien pour moi.
Micks Ketches
3
Hm ... ne fonctionne qu'avec l'ajout .pour moi. Je me demande pourquoi.
Costa
29

Ce one-liner fonctionne bien pour formater JSON dans Vim dans une forme lisible par l'homme:

:%!python -m json.tool

ljs.dev
la source
1
Le mémorisez-vous et le tapez-vous à chaque fois ou utilisez-vous une sorte d'alias?
asedsami
J'ai tendance à utiliser la :%!jq .réponse ces jours-ci, car je fais moins avec Python et j'ai tendance à avoir jqinstallé sur mes systèmes pour tout travail JSON en CLI. Je reçois également des notifications pour cette question SO assez souvent, donc cela m'aide à ne pas oublier: PI préfère vim avec une personnalisation minimale, pas de plugins, etc., ce qui est une autre raison pour laquelle la jqsolution est maintenant ma préférée.
ljs.dev
(mise à jour de la réponse acceptée pour refléter cela)
ljs.dev
3
Juste un avertissement que cela échappera à certains caractères uniquement en ASCII. Donc, si vous voulez que l'encodage UTF8 jq soit la meilleure option.
AndrewHarvey
5

Pour formater de manière déterministe, nous devons trier le hachage. Aucune des autres réponses n'a fait cela pour moi, alors j'ai créé la mienne:

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

Usage:

:call FormatJson()
Prajit Patil
la source
Bienvenue chez Vi et Vim ! Belle première réponse; il est intéressant de considérer l'aspect tri!
D. Ben Knoble
À propos du tri, je suis presque sûr que jqmentionné dans les réponses SebMa a une --sort-keysoption qui ferait le travail. Mais c'est cool d'écrire aussi votre propre implémentation :)
statox
1

Si PHP est disponible, ajoutez l'outil en jftant que formateur JSON par compositeur:

$ composer global require codegear/json-formatter

Ensuite, formatez le fichier actuel:

:%!jf %

Ou ajoutez un clavier dans vimrc:

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

J'utilise cette :Jsonfcommande. Il peut formater 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
la source