Cara memformat file JSON di Vim


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 .

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


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

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>

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)))"'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.