Cara memformat file JSON di Vim

27

Diberikan file dengan objek JSON besar semua pada satu baris seperti

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

Bagaimana saya bisa memformat ini agar dapat dibaca manusia di Vim?

ljs.dev
sumber
1
Posting StackOverflow terkait: Bagaimana cara memperbaiki indentasi JSON di vim?
Peter Rincker

Jawaban:

47

Atau Anda dapat menginstal jqyang lebih cepat (ditulis dalam C) dari manajer paket Anda (mis. sudo apt install jqDi Ubuntu / Debian, sudo dnf install jqdi Fedora / RHEL / CentOS) atau dari sumber dan kemudian di vim, ketik:

:%!jq .
SebMa
sumber
1
:%!jqbekerja dengan baik untuk saya.
Micks Ketches
3
Hm ... hanya bekerja dengan yang ditambahkan .untuk saya. Kenapa ya.
Costa
29

One-liner ini berfungsi baik untuk memformat JSON di Vim menjadi bentuk yang dapat dibaca manusia:

:%!python -m json.tool

ljs.dev
sumber
1
Apakah Anda mengingatnya dan mengetiknya setiap kali atau Anda menggunakan semacam alias?
asedsami
Saya cenderung menggunakan :%!jq .jawabannya hari ini, karena saya melakukan lebih sedikit dengan Python dan cenderung telah jqdiinstal pada sistem saya untuk setiap pekerjaan JSON di CLI. Saya juga mendapatkan pemberitahuan untuk pertanyaan SO ini cukup sering, sehingga membantu saya untuk tidak melupakan: PI lebih suka vim dengan kustomisasi minimal, tanpa plugin, dll, yang merupakan alasan lain jqsolusinya sekarang menjadi pilihan saya.
ljs.dev
(diperbarui jawaban yang diterima untuk mencerminkan hal ini)
ljs.dev
3
Hanya peringatan bahwa ini akan melarikan diri beberapa karakter ke ASCII saja. Jadi jika Anda ingin UTF8, enkode jq adalah pilihan yang lebih baik.
AndrewHarvey
5

Untuk memformat dengan cara deterministik, kita perlu mengurutkan hash. Tidak ada jawaban lain yang melakukannya untuk saya, jadi saya buat sendiri:

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

Pemakaian:

:call FormatJson()
Prajit Patil
sumber
Selamat datang di Vi dan Vim ! Jawaban pertama yang bagus; Sangat menarik bahwa Anda mempertimbangkan aspek penyortiran!
D. Ben Knoble
Tentang penyortiran saya cukup yakin jqdisebutkan dalam jawaban SebMa memiliki --sort-keysopsi yang akan melakukan pekerjaan. Tapi keren juga untuk menulis implementasi Anda sendiri :)
statox
1

Jika PHP tersedia, tambahkan alat jfsebagai Formatter JSON oleh Komposer:

$ composer global require codegear/json-formatter

Kemudian Format file saat ini:

:%!jf %

Atau tambahkan keymap di vimrc:

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

Saya menggunakan :Jsonfperintah ini . Ini bisa memformat 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
sumber