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?
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?
Jawaban:
Atau Anda dapat menginstal jq
yang lebih cepat (ditulis dalam C) dari manajer paket Anda (mis. sudo apt install jq
Di Ubuntu / Debian, sudo dnf install jq
di Fedora / RHEL / CentOS) atau dari sumber dan kemudian di vim, ketik:
:%!jq .
:%!jq
bekerja dengan baik untuk saya.
.
untuk saya. Kenapa ya.
One-liner ini berfungsi baik untuk memformat JSON di Vim menjadi bentuk yang dapat dibaca manusia:
:%!python -m json.tool
:%!jq .
jawabannya hari ini, karena saya melakukan lebih sedikit dengan Python dan cenderung telah jq
diinstal 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 jq
solusinya sekarang menjadi pilihan saya.
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()
jq
disebutkan dalam jawaban SebMa memiliki --sort-keys
opsi yang akan melakukan pekerjaan. Tapi keren juga untuk menulis implementasi Anda sendiri :)
Jika PHP tersedia, tambahkan alat jf
sebagai 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>
Saya menggunakan :Jsonf
perintah 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)))"'