I am trying to edit a Swagger JSON file in emacs. It contains large nested JSON objects, so I want to collapse and hide some of them.

I have tried origami-mode, configured as origami-c-style-parser in origami-parser-alist, but it is quite unsophisticated (the word "parser" seems to be an overly grandiose word for what it does). It doesn't notice that Swagger URL parameter substrings like {id} are inside JSON strings, so it happily collapses them too when I ask it to collapse all nodes in the buffer except the current node. I don't want it to do that. I want a way of collapsing only JSON subtrees like objects, not substrings of JSON strings that happen to have curly braces in them. How can I achieve this goal?

  • I don't know this for sure, but it is quite possible that js2-mode has folding that can also fold JSON files. – wvxvw Jul 12 '16 at 5:55
  • Related: Code-folding extensions for json. – Dan Jul 12 '16 at 15:48
  • One approach is to convert your json into some similar tree format and operate on that. This can convert into xml github.com/hay/xml2json. Yaml would be another approach. – Att Righ Feb 15 '17 at 18:43

Emacs comes with hs-minor-mode which can be used selectively hide/show code and comment blocks in several languages, including JavaScript. By default this will let you hide and show JSON blocks delimited by '{' and '}' but it is easily modified to allow '[' and ']' as block delimeters as well. To do this we need to modify the js-mode entry in hs-special-modes-alist with something like:

(setcdr (assoc 'js-mode hs-special-modes-alist) '("[{[]" "[}\\]]" "/[*/]" nil))

You should then find that [...] blocks can be hidden and shown as well as {...} blocks.


My json-mode has a code folding feature which shouldn't try to fold things that look like Objects or Arrays inside of strings. It's not a mature major-mode, but it should be usable.

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.