Đưa ra một tệp có một đối tượng JSON lớn tất cả trên một dòng như
{"versions":[{"count":2,"version":""},{"count":1,"version":"1.1.1"},{"count":14,"version":"2.9"},{...
Làm thế nào tôi có thể định dạng này để con người có thể đọc được trong Vim?
Đưa ra một tệp có một đối tượng JSON lớn tất cả trên một dòng như
{"versions":[{"count":2,"version":""},{"count":1,"version":"1.1.1"},{"count":14,"version":"2.9"},{...
Làm thế nào tôi có thể định dạng này để con người có thể đọc được trong Vim?
Câu trả lời:
Hoặc bạn có thể cài đặt jq
nhanh hơn (được viết bằng C) từ trình quản lý gói của bạn (ví dụ: sudo apt install jq
trong Ubuntu / Debian, sudo dnf install jq
trên Fedora / RHEL / CentOS) hoặc từ nguồn và sau đó trong vim, gõ:
:%!jq .
:%!jq
làm việc tốt cho tôi
.
cho tôi. Tôi tự hỏi tại sao.
Lớp lót này hoạt động tốt để định dạng JSON trong Vim thành dạng có thể đọc được:
:%!python -m json.tool
:%!jq .
câu trả lời ngày nay, vì tôi làm ít hơn với Python và có xu hướng đã jq
cài đặt trên các hệ thống của tôi cho bất kỳ công việc JSON nào trong CLI. Tôi cũng nhận được thông báo cho câu hỏi SO này khá thường xuyên, vì vậy nó giúp tôi không quên: PI thích vim với tùy chỉnh tối thiểu, không có plugin, v.v., đó là một lý do khác mà jq
giải pháp hiện đang được tôi ưu tiên.
Để định dạng theo cách xác định, chúng ta cần sắp xếp hàm băm. Không có câu trả lời nào khác làm điều đó cho tôi, vì vậy tôi đã tạo ra câu trả lời của riêng mình:
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
Sử dụng:
:call FormatJson()
jq
đề cập trong các câu trả lời của SebMa có một --sort-keys
tùy chọn sẽ thực hiện công việc. Nhưng thật tuyệt khi viết bản triển khai của riêng bạn :)
Nếu PHP có sẵn, hãy thêm công cụ jf
dưới dạng Trình định dạng JSON của Trình soạn thảo:
$ composer global require codegear/json-formatter
Sau đó định dạng tệp hiện tại:
:%!jf %
Hoặc thêm một sơ đồ bàn phím trong vimrc:
nnoremap <Leader>jf :%!jf %<CR>
Tôi sử dụng :Jsonf
lệnh này . Nó có thể định dạng 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)))"'