Emacs-Modus zum Bearbeiten von JSON

75

Kennt jemand einen guten Emacs-Modus zum Bearbeiten von JSON? Eine App, an der ich arbeite, verwendet ein JSON-basiertes Kommunikationsprotokoll. Wenn die Daten gut eingerückt und die Syntax hervorgehoben sind, kann ich dies sehr gut herausfinden.

Ryszard Szopa
quelle
siehe emacs.stackexchange.com/questions/24855/… Ich benutze den js2-Modus, um JSON zu validieren
chen bin

Antworten:

34

+1 für Joshs Json-Modus - funktioniert gut für mich. Ich fügte hinzu

(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)))

und

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

auf json-mode.el, um den Aufruf des Shell-Befehls zu vereinfachen.

UPDATE: Für diejenigen unter Ihnen, die dies mit Unicode tun möchten, siehe meine Frage hier . Das Ergebnis ist, anstatt zu verwenden:

python -m json.tool

Sie werden verwenden wollen

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")'

Dies verschönert sowohl den JSON als auch den ursprünglichen Unicode-Inhalt.

jstevenco
quelle
fwiw, ich gab Joshs json-Modus auf und fügte jstevencos Hinzufügung hinzu unter github.com/chad3814/json-mode
chad
Die neueste Version von json-mode hat jetzt das Problem mit utf-8 behoben: siehe github.com/joshwnj/json-mode/issues/5
Jarl
1
Dies alles funktioniert sofort, wenn das neueste json-mode-Paket auf melpa installiert wird . Gute Arbeit Jungs.
TooTone
Nicht "unicode_escape"mit JSON-Inhalten verwenden. Verwenden Sie ensure_ascii=Falsestattdessen.
JFS
29

Der js-Modus unterstützt das Hervorheben und Einrücken der Syntax für json-Dateien.

Dies ist , wie von Emacs 23.2 , wenn Espresso-Modus wurde in Emacs integriert und js-Modus umbenannt.

Probieren Sie es aus: http://www.nongnu.org/espresso/

Steve
quelle
6
Nett! Ich legte (setq auto-mode-alist (cons '("\\.json\\'" . js-mode) auto-mode-alist))meine.emacs
Marvin
(add-to-list 'auto-mode-alist '("\\.json$" . js-mode))ist das gleiche, aber etwas kürzer.
ksrb
15

Wenn Sie etwas Leichtes wollen, probieren Sie diesen Hauptmodus, den ich zusammen gehackt habe: https://github.com/joshwnj/json-mode

Es ist eigentlich nicht mehr als eine zusätzliche Syntax, die zusätzlich zum Javascript-Modus hervorgehoben wird, aber für meine Zwecke habe ich festgestellt, dass es ziemlich gut funktioniert.

Ein weiterer häufiger Anwendungsfall ist die automatische Formatierung einer JSON-Datei (z. B. wenn diese durch Leerzeichen komprimiert ist und Sie eine bessere Lesbarkeit wünschen). Dazu leite ich den Puffer einfach durch ein Befehlszeilenskript: Cu M- |

Josh
quelle
2
fwiw, ich habe dieses Repo gegabelt und die Schönheitsfunktion von jstevenco hinzugefügt, und es ist unter github.com/chad3814/json-mode - hat auch eine Pull-Anfrage gesendet.
Chad
FWIW Josh akzeptierte Chad's Pull-Anfrage, jstevencos Hinzufügung aufzunehmen (hast du das alles?), So dass Joshs json-mode repo auf github zum jetzigen Zeitpunkt die aktuellste Quelle für json-mode ist.
Steven Collins
Bitte wenden Sie den Nicht-ASCII-Fix an.
Jarl
Ist das ein Fehler oder mache ich etwas falsch? emacs.stackexchange.com/q/17319/4003 (Ich lade den json-Modus in meine .emacs)
Marcus Junius Brutus
5

json.el von Edward O'Connor ist seit 23.1 (2008) Teil von GNU Emacs.

Es ist zwar kein Syntax-Textmarker, hat aber eine nützliche Funktion zum Formatieren von JSON:

M-x json-pretty-print-buffer RET

Wenn Sie also eine aktuelle Version von Emacs haben, ist jqoder nicht erforderlich python -m json.tool.

Gavenkoa
quelle
1
Bei Verwendung json-pretty-print-buffervon GNU Emacs 24.5.1 habe ich festgestellt, dass es meinen JSON zwar gut formatiert, aber auch seinen Inhalt umkehrt. Glücklicherweise stellte ich auch fest, dass ein zweites Ausführen auf meinem JSON die ursprüngliche Reihenfolge wiederherstellt.
DavidRR
3

Da JSON eine Teilmenge von YAML ist, yaml-modefunktioniert es auch (ich weiß jedoch nicht, wie es mit js-modeund verglichen json-modewird).

Installieren (von Emacs) : M-x package-install yaml-mode.

Zuordnung von yaml-modemit YAML- und JSON-Dateien, in ~/.emacs.d/init.el:

(add-to-list 'auto-mode-alist '("\\.yaml$" . yaml-mode))
(add-to-list 'auto-mode-alist '("\\.json$" . yaml-mode))
Eric O Lebigot
quelle
0

JSON wird vom Espresso-Modus unterstützt

逸飞.
quelle
2
Ich kann nur den Espresso-Modus dazu bringen, mit legaler Javascript-Syntax zu arbeiten. JSON-Ausdrücke werden beispielsweise nicht richtig eingerückt.
ESV
Espresso wurde ab Version 23.2 in GNU Emacs integriert und in js-mode umbenannt. Der Espresso-Modus wird außerhalb von Emacs nicht mehr beibehalten.
Jeff Bauer
0

Ich werde auch Joshs json-Modus unterstützen, aber auch flymake-json als Ergänzung empfehlen. Es hilft, Syntaxfehler hervorzuheben.

Ich verwende es nicht gern, python -mjson.toolweil es Elemente in JSON-Objekten neu anordnet. Ich finde, dass (prog-indent-sexp)Arbeiten gut zum erneuten Einrücken geeignet sind und jsonlint anstelle von python -mjson.toolArbeiten zum hübschen Drucken / Neuformatieren verwendet werdenbeautify-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))
  )
)
djb
quelle
0

Ich habe auf Mariusz Nowak erweitert Abhilfe , es als Hauptmodus in seinem eigenen Recht zu machen verwendbar. Über das einfache Ableiten des Modus hinaus waren nur wenige Änderungen erforderlich. Die einzige Änderung, die Nowaks Arbeit tatsächlich benötigte, war die Fähigkeit, Puffer zu erkennen, die nicht mit Dateien verknüpft sind oder mit Dateien verknüpft sind, deren Namen nicht enden.json als JSON , was wir mit einer pufferlokalen Variablen erreichen.

Hier ist die erweiterte Problemumgehung:

(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))

Wenn Sie den js2-Modus bereits verwenden, ist dies möglicherweise eine bessere Option als js-modeplus, flymake-jsonda Sie nichts Neues installieren müssen (der js2-Modus führt bereits eine Syntaxprüfung durch, kein externes Tool erforderlich) und weil dieser Modus Ihren js2-Modus erbt Konfiguration, die js-Modus nicht wird.

Aaron Miller
quelle
-7

Ich würde auch js2-mode empfehlen.

JSON steht für JavaScript Object Notation. Es ist keine andere Sprache und es ist sogar kein Datencontainer wie yaml oder xml. JSON kann als Datencontainer verwendet werden, wenn in einem JSON-Objekt keine Funktion (oder in diesem Fall Methode) vorhanden ist, dies ist jedoch nicht das Hauptziel von JSON :-)

var myJSObject = {
  attr: {foo: "bar", baz: ["quux", "truc", "pouet"]},
  fooAlert: function (num) {
    alert(this.attr.foo+' '+num);
  }
};
myJSObject.fooAlert(42);
p4bl0
quelle
10
Um genau zu sein, ist das von Ihnen bereitgestellte Beispiel nicht JSON, sondern das JavaScript-Objektliteral, das ähnlich, aber unterschiedlich ist.
viam0Zah
6
Eine andere Sprache, die ein Datencontainer wie YAML oder XML ist, ist genau das, was JSON eigentlich ist, und JSON erlaubt keine Funktionen.
Kragen Javier Sitaker