Emacs-modus om JSON te bewerken

Weet iemand een goede Emacs-modus om JSON te bewerken? Een app waaraan ik werk, maakt gebruik van een op JSON gebaseerd communicatieprotocol en als de gegevens netjes ingesprongen zijn en de syntaxis is gemarkeerd, zou dat me enorm helpen bij het uitzoeken ervan.


Antwoord 1, autoriteit 100%

+1 voor Josh’s json-mode— werkt goed voor mij. Ik heb toegevoegd

(defun beautify-json ()
  (interactive)
  (let ((b (if mark-active (min (point) (mark)) (point-min)))
        (e (if mark-active (max (point) (mark)) (point-max))))
    (shell-command-on-region b e
     "python -m json.tool" (current-buffer) t)))

en

(define-key json-mode-map (kbd "C-c C-f") 'beautify-json)

naar json-mode.el om het aanroepen van de shell-opdracht gemakkelijker te maken.

UPDATE:voor degenen onder u met een behoefte/wens om dit met unicode te doen, zie mijn vraag hier. Het resultaat is eerder dan het gebruik van:

python -m json.tool

die je wilt gebruiken

python -c 'import sys,json; data=json.loads(sys.stdin.read()); print json.dumps(data,sort_keys=True,indent=4).decode("unicode_escape").encode("utf8","replace")'

Dit verfraait zowel de JSON als de originele Unicode-inhoud.


Antwoord 2, autoriteit 81%

js-modus ondersteunt syntaxisaccentuering en inspringing voor json-bestanden.

Dit is vanaf Emacs 23.2, toen espresso-modus werd opgenomen in Emacs en hernoemd naar js-mode.

Bekijk het:
http://www.nongnu.org/espresso/


Antwoord 3, autoriteit 42%

Heb je Steve Yegge’s js2-modus voor Emacsgeprobeerd?


Antwoord 4, autoriteit 42%

Als je iets lichtgewichts wilt, probeer dan deze hoofdmodus die ik heb gehackt: https://github.com/ joshwnj/json-mode

Het is eigenlijk niet meer dan wat extra syntaxisaccentuering bovenop de javascript-modus, maar voor mijn doeleinden heb ik gemerkt dat het best goed werkt.

Een andere veelvoorkomende use-case is het automatisch formatteren van een JSON-bestand (bijvoorbeeld als het gecomprimeerd is met witruimte en u meer leesbaarheid wilt). Om dit te doen, stuur ik de buffer gewoon door een opdrachtregelscript: C-u M-|


Antwoord 5, autoriteit 25%

Ik heb een tijdelijke oplossing voorbereid voor js2-modezodat json wordt geparseerd bestanden zonder fouten.
Je kunt het vinden in mijn opmerking: http:// code.google.com/p/js2-mode/issues/detail?id=50#c7

(Ik wilde het plaatsen als een reactie op de J.F. Sebastian-oplossing, maar het lijkt erop dat ik dit niet mag doen (geen link ‘commentaar toevoegen’))


Antwoord 6, autoriteit 14%

json.eldoor Edward O’Connor maakt sinds 23.1 (2008) deel uit van GNU Emacs.

Hoewel het geen syntax highlighter is, heeft het een handige functie om JSON te formatteren:

M-x json-pretty-print-buffer RET

Dus als je een recente versie van Emacs hebt, is jqof python -m json.toolniet nodig.


Antwoord 7, autoriteit 8%

Aangezien JSON een subset is van YAML, werkt yaml-modeook (ik weet niet hoe het zich verhoudt tot js-modeen json-modeechter).

Installeren (van emacs): M-x package-install yaml-mode.

Associatie van yaml-modemet YAML- en JSON-bestanden, in ~/.emacs.d/init.el:

(add-to-list 'auto-mode-alist '("\\.yaml$" . yaml-mode))
(add-to-list 'auto-mode-alist '("\\.json$" . yaml-mode))

Antwoord 8

JSON wordt ondersteund door espresso-modus


Antwoord 9

js3-mode:https://github.com/thomblake/js3-mode

js3-mode is een verbeterde js2-mode

Dit pakket kan worden geïnstalleerd met de opdracht package-list-packages


Antwoord 10

Ik zal ook de json-modus van Josh ondersteunen, maar ook flymake-json aanbevelen als toevoeging. Het helpt syntaxisfouten te markeren.

Ik gebruik niet graag python -mjson.toolomdat het items in JSON-objecten opnieuw ordent.
Ik vind dat (prog-indent-sexp)prima werkt om opnieuw in te springen en jsonlintte gebruiken
in plaats van python -mjson.toolwerkt voor mooi afdrukken/opnieuw formatteren in beautify-json

(eval-after-load "json-mode"
  '(progn
     (require 'flymake-json)
     ;; flymake-cursor displays error in minibuffer message area instead of requiring hover
     (require 'flymake-cursor)
     (add-hook 'json-mode-hook 'flymake-json-load)
     (define-key json-mode-map "\C-c\C-n" (function flymake-goto-next-error))
  )
)

Antwoord 11

Ik heb de oplossingvan Mariusz Nowak uitgebreid om het bruikbaar te maken als een belangrijke modus op zich. Er was weinig wijziging nodig dan alleen het afleiden van de modus; de enige verandering die het werk van Nowak eigenlijk nodig had, was de mogelijkheid om buffers te herkennen die niet aan bestanden zijn gekoppeld, of die zijn gekoppeld aan bestanden waarvan de naam niet eindigt op .json, als JSON, wat we bereiken met een buffer-local variabel.

Dit is de verbeterde oplossing:

(make-variable-buffer-local 'js2-parse-as-json)
(defadvice js2-reparse (before json)
    (setq js2-buffer-file-name buffer-file-name))
(ad-activate 'js2-reparse)
(defadvice js2-parse-statement (around json)
    (if (and (= tt js2-LC)
           js2-buffer-file-name
           (or js2-parse-as-json
               (string-equal (substring js2-buffer-file-name -5) ".json"))
           (eq (+ (save-excursion
                    (goto-char (point-min))
                    (back-to-indentation)
                    (while (eolp)
                      (next-line)
                      (back-to-indentation))
                    (point)) 1) js2-ts-cursor))
      (setq ad-return-value (js2-parse-assign-expr))
        ad-do-it))
(ad-activate 'js2-parse-statement)
(define-derived-mode json-mode js2-mode "JSON"
  "Major mode for editing JSON data."
  :group 'json
  (setq js2-parse-as-json t)
  (js2-reparse t))
(add-to-list 'auto-mode-alist '("\\.json$" . json-mode))

Als je js2-mode al gebruikt, is dit misschien een betere optie dan js-modeplus flymake-jsonomdat je niets nieuws hoeft te installeren (js2-mode doet al syntaxcontrole, geen externe tool nodig), en omdat deze modus uw js2-mode-configuratie erft, wat js-mode niet zal doen.


Antwoord 12

Ik zou ook js2-mode aanraden.

JSON staat voor JavaScript Object Notation. Het is geen andere taal en het is zelfs geen datacontainer zoals yaml of xml. JSON kan worden gebruikt als een gegevenscontainer als er geen functie (of in dit geval moeten we zeggen methode) in een JSON-object is, maar het is niet het primaire doel van JSON 🙂

var myJSObject = {
  attr: {foo: "bar", baz: ["quux", "truc", "pouet"]},
  fooAlert: function (num) {
    alert(this.attr.foo+' '+num);
  }
};
myJSObject.fooAlert(42);

Other episodes