Cách định dạng tệp JSON trong Vim


26

Đư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:


45

Hoặc bạn có thể cài đặt jqnhanh 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 jqtrong Ubuntu / Debian, sudo dnf install jqtrên Fedora / RHEL / CentOS) hoặc từ nguồn và sau đó trong vim, gõ:

:%!jq .

1
:%!jqlàm việc tốt cho tôi
Micks Ketches

1
Hừm ... chỉ hoạt động với phần bổ sung .cho tôi. Tôi tự hỏi tại sao.
Costa

27

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


1
Bạn có ghi nhớ điều đó và gõ nó mỗi lần hoặc bạn sử dụng một số bí danh?
asbedami

Tôi có xu hướng sử dụng :%!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 đã jqcà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à jqgiải pháp hiện đang được tôi ưu tiên.
ljs.dev

(cập nhật câu trả lời được chấp nhận để phản ánh điều này)
ljs.dev

3
Chỉ cần một cảnh báo rằng điều này sẽ thoát một số ký tự vào ASCII mà thôi. Vì vậy, nếu bạn muốn mã hóa UTF8 jq là lựa chọn tốt hơn.
AndrewHarvey

4

Để đị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()

Chào mừng đến với Vi và Vim ! Câu trả lời đầu tiên tốt đẹp; Thật thú vị khi bạn xem xét khía cạnh sắp xếp!
D. Ben Knoble

Về cách sắp xếp tôi khá chắc chắn được jqđề cập trong các câu trả lời của SebMa có một --sort-keystù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 :)
statox

1

Nếu PHP có sẵn, hãy thêm công cụ jfdướ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>

1

Tôi sử dụng :Jsonflệ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)))"'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.