I find the various linters and checkers a bit too intrusive while I'm trying to code - I prefer to just have a check when I stop fiddling with the code and save it. So I have these checks run in after-save-hook - if there are errors, I get a popup otherwise nothing and all is good:
;; ** syntax checking on file save:
(defun bh/check-syntax ()
"Check syntax for various languages."
(when (eq major-mode 'emacs-lisp-mode)
(ignore-errors (kill-buffer byte-compile-log-buffer))
(let ((byte-compile-warnings '(not free-vars obsolete unresolved)))
(unless (byte-compile-file buffer-file-name)
(pop-to-buffer byte-compile-log-buffer))))
(when (eq major-mode 'sh-mode)
(compile (format "bash -n %s && shellcheck -f gcc %s" buffer-file-name buffer-file-name) t))
(when (eq major-mode 'ruby-mode)
(compile (format "ruby -c %s" buffer-file-name) t))
(when (eq major-mode 'python-mode)
(compile (format "python -B -m py_compile %s" buffer-file-name) t))
(when (eq major-mode 'awk-mode)
(compile (format "AWKPATH=$PATH gawk --lint --source 'BEGIN { exit(0) } END { exit(0) }' --file %s" buffer-file-name) t)))
(add-hook 'after-save-hook #'bh/check-syntax)
I don't work much with json files but I daresay the idea could be extended to them. Sorry about the crappy elisp.