" Set custom fold expression
setlocal foldmethod=expr
setlocal foldexpr=JsonFold(v:lnum)

" Custom fold function
function! JsonFold(lnum)
  let l:line = getline(a:lnum)

  if l:line =~ '{' && l:line !~ '}' && l:line !~ '".*{.*"'
    return 'a1'
  elseif l:line =~ '[' && l:line !~ ']' && l:line !~ '".*].*"'
    return 'a1'
  elseif l:line =~ '}' && l:line !~ '{' && l:line !~ '".*}.*"'
    return 's1'
  elseif l:line =~ ']' && l:line !~ '[' && l:line !~ '".*[.*"'
    return 's1'
  endif

  return '='
endfunction

" Override default group names
hi link jsonQuote Operator
hi link jsonKeyword Keyword