JSONファイルをVimでフォーマットする方法


26

大きなJSONオブジェクトがすべて1行に含まれるファイルがあるとします。

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

これをVimで人間が読めるようにフォーマットするにはどうすればよいですか?


回答:


45

またはjq、パッケージマネージャー(sudo apt install jqUbuntu / Debian、sudo dnf install jqFedora / RHEL / CentOSなど)またはソースから vimに次のように入力して、(Cで記述された)より高速なものをインストールできます。

:%!jq .

1
:%!jq私も同じように機能します。
Micks Ketches

1
うーん... .私のために追加された場合にのみ機能します。なんでかしら。
コスタ

27

このワンライナーは、VimのJSONを人間が読める形式にフォーマットするのに適しています。

:%!python -m json.tool


1
それを覚えて毎回入力しますか、それとも何らかのエイリアスを使用しますか?
asedsami

私は:%!jq .最近、Pythonをあまり使用せずjq、CLIでのJSON作業のためにシステムにインストールする傾向があるため、この答えを使用する傾向があります。私もこのSO質問の通知を頻繁に受け取るので、:PIが最小限のカスタマイズ、プラグインなしのvimを好むことを忘れないようにするのに役立ちますjq
ljs.dev

(これを反映するために承認された回答を更新)
ljs.dev '14

3
これは一部の文字をASCIIのみにエスケープするという警告です。したがって、UTF8エンコーディングが必要な場合は、jqの方が適しています。
AndrewHarvey

4

確定的な方法でフォーマットするには、ハッシュをソートする必要があります。他の答えはどれも私のためにそれをしなかったので、私は自分で作成しました:

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

使用法:

:call FormatJson()

ViとVimへようこそ!最初の正解です。並べ替えの側面を考慮するのは興味深いことです。
D.ベンノーブル

並べ替えについて、jqSebMaの回答で言及されているのは、--sort-keysその仕事を行うオプションがあると確信しています。しかし、独自の実装を書くのもクールです:)
statox

1

PHPを使用できる場合は、ComposerによってツールjfJSONフォーマッターとして追加します。

$ composer global require codegear/json-formatter

次に、現在のファイルをフォーマットします。

:%!jf %

または、vimrcにキーマップを追加します。

nnoremap <Leader>jf :%!jf %<CR>

1

この:Jsonfコマンドを使用します。ユニコードをフォーマットできます。

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)))"'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.