Given a file with a large JSON object all on one line like


How can I format this to be human readable in Vim?


Or you can install jq which is faster (written in C) from your package manager (e.g. sudo apt install jq in Ubuntu/Debian, sudo dnf install jq on Fedora/RHEL/CentOS) or from source and then in vim, type:

:%!jq .
  • 1
    :%!jq works just as well for me. – Micks Ketches Dec 27 '19 at 22:38
  • 5
    Hm... only works with the added . for me. I wonder why. – Costa Michailidis Apr 15 '20 at 23:02
  • 1
    on MacOS, I need the . as well – Thomas Jun 14 '20 at 18:53
  • 1
    Don't need to install jq on Ubuntu/Debian 14+ onward. – logbasex Nov 26 '20 at 6:33
  • On MacOS after installing jq with brew install jq I could also just type :%!jq without a dot at the end – olik79 Apr 20 at 19:01

This one-liner works well to format JSON in Vim into a human readable form:

:%!python -m json.tool

  • 1
    Do you memorize that and type it every time or do you use some kind of alias? – asedsami Dec 13 '19 at 17:05
  • I tend to use the :%!jq . answer these days, as I do less with Python and tend to have jq installed on my systems for any JSON work in CLI. I also get notifications for this SO question quite often, so it helps me not to forget :P I prefer vim with minimal customization, no plugins, etc, which is another reason the jq solution is now my preferred. – ljs.dev Dec 14 '19 at 7:37
  • (updated accepted answer to reflect this) – ljs.dev Dec 14 '19 at 7:37
  • 6
    Just a warning that this will escape some characters into ASCII only. So if you want UTF8 encoding jq is the better option. – AndrewHarvey Feb 5 '20 at 3:01
  • Python 3.9 has introduced the option --no-ensure-ascii. – Hotschke May 27 at 6:55

To format in a deterministic way, we need to sort the hash. None of the other answers did that for me, so I created my own:

function! FormatJson()
python << EOF
import vim
import json
    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


:call FormatJson()
  • Welcome to Vi and Vim! Nice first answer; it's interesting that you consider the sorting aspect! – D. Ben Knoble Nov 19 '19 at 15:26
  • 1
    About the sorting I'm pretty sure jq mentionned in SebMa answers has a --sort-keys option which would do the job. But it's cool to write your own implementation too :) – statox Nov 19 '19 at 16:23

I use this :Jsonf command. It's can format 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)))"'

If PHP is available, add the tool jf as a JSON Formatter by Composer:

$ composer global require codegear/json-formatter

Then Format current file:

:%!jf %

Or add a keymap in vimrc:

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

If nodejs and xargs are available on your system you can add the following command to your .vimrc

command! -range FormatJson <line1>,<line2>!xargs -0 -I {} node -e 'console.log(JSON.stringify({}, null, 2));'

After that you can visual select the JSON text in the buffer and run


to pretty print it. Works with Unicode too.


Another solution is to use coc-format-json.


I wanted to open jq with vim. However i didn't manage to find a way to do it in one command.

I wrote a shell script, and it worked for me (linux version : redhat 7.6):

# Don't miss the dot after jq
cat input.json | jq . > output.json
vim output.json
  • 2
    You can use - to read from stdin: jq input.json . | vim - (maybe you need to reverse the input.json and . in that jq command). Another option would be to use -c or + to run a command when Vim opens: vim +':%!jq .' input.json – Martin Tournoij May 3 at 7:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.