Режим Emacs для редактирования JSON

Кто-нибудь знает хороший режим Emacs для редактирования JSON? Приложение, над которым я работаю, использует протокол связи на основе JSON, и наличие данных с красивым отступом и выделением синтаксиса очень поможет мне в процессе выяснения этого.

см. emacs.stackexchange.com/questions/24855/… Я использую js2-режим для проверки JSON

chen bin 07.08.2016 17:04
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
75
1
28 255
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Ответ принят как подходящий

Вы пробовали js2-mode для Emacs Стива Йегге?

Однако JSON на самом деле не поддерживается js2-режимом. code.google.com/p/js2-mode/issues/detail?id=50

viam0Zah 18.04.2009 04:48

@ Török Gábor: Знаете ли вы лучшую альтернативу?

jfs 28.11.2010 20:43

Я бы также рекомендовал js2-mode.

JSON расшифровывается как JavaScript Object Notation. Это не другой язык и даже не контейнер данных, как yaml или xml. JSON можно использовать в качестве контейнера данных, если внутри объекта JSON нет функции (или в этом случае мы должны сказать метода), но это не основная цель JSON :-)

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

Точнее, приведенный вами пример - это не JSON, а литерал объекта JavaScript, который похож, но отличается.

viam0Zah 18.04.2009 03:44

Другой язык, который представляет собой контейнер данных, такой как YAML или XML, - это в точности то, что на самом деле представляет собой JSON, а JSON не допускает функций.

Kragen Javier Sitaker 15.04.2011 22:01

JSON поддерживается эспрессо-режим

Я могу заставить работать режим эспрессо только с легальным синтаксисом Javascript. Например, выражения JSON не имеют правильного отступа.

ESV 05.02.2010 07:51

Espresso был включен в GNU Emacs, начиная с версии 23.2, и был переименован в js-mode. режим эспрессо больше не будет поддерживаться за пределами собственно Emacs.

Jeff Bauer 10.11.2014 05:00

Я подготовил обходной путь для js2-режим, чтобы он анализировал файлы json без ошибок. Вы можете найти это в моем комментарии: http://code.google.com/p/js2-mode/issues/detail?id=50#c7

(Я хотел опубликовать его как комментарий к решению J.F. Sebastian, но, похоже, мне не разрешено это делать (нет ссылки «добавить комментарий»))

Если вы хотите что-то легкое, попробуйте этот основной режим, который я разработал вместе: https://github.com/joshwnj/json-mode

На самом деле это не более чем дополнительная подсветка синтаксиса поверх режима javascript, но для моих целей я обнаружил, что это работает довольно хорошо.

Другой распространенный вариант использования - это автоматическое форматирование файла JSON (например, если он сжат с помощью пробелов и вам нужна более удобная читаемость). Для этого я просто пропускаю буфер через сценарий командной строки: C-u M- |

fwiw, я раздвоил это репо и добавил функцию jstevenco beautify-json, и она находится в github.com/chad3814/json-mode - также отправил запрос на перенос.

chad 10.05.2012 18:04

Пожалуйста, примените исправление, отличное от ASCII.

Jarl 26.11.2012 15:46

FWIW Джош принял запрос Чада на включение добавления jstevenco (получил все это?), Так что на момент написания этой статьи Репозиторий Джоша в json-режиме на github является наиболее актуальным источником для json-режима.

Steven Collins 06.08.2012 21:47

Это ошибка или я что-то не так делаю? emacs.stackexchange.com/q/17319/4003 (я загружаю json-режим в свой .emacs)

Marcus Junius Brutus 12.10.2015 22:46

+1 за json-режим Джоша - у меня работает хорошо. я добавил

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

а также

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

в json-mode.el, чтобы упростить вызов команд оболочки.

Обновлено: Для тех из вас, у кого есть потребность / желание сделать это с помощью Unicode, см. Мой вопрос здесь. Результатом является использование:

python -m json.tool

вы захотите использовать

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

Это как украшает JSON, так и сохраняет исходное содержимое Unicode.

fwiw, я разветвил json-режим Джоша и добавил к нему дополнение jstevenco в github.com/chad3814/json-mode

chad 10.05.2012 18:00

Я запросил исправление для не-ASCII udate в github.com/joshwnj/json-mode/issues/5

Jarl 26.11.2012 15:44

В последней версии json-mode теперь исправлена ​​проблема с utf-8: см. github.com/joshwnj/json-mode/issues/5

Jarl 04.01.2013 11:38

Все это работает, если установить последнюю версию пакет json-mode на мелпа. Хорошие ребята поработали.

TooTone 17.02.2015 19:03

не используйте "unicode_escape" с содержимым json. Вместо этого используйте ensure_ascii=False.

jfs 18.04.2015 06:55

js-mode поддерживает выделение синтаксиса и отступы для файлов json.

Это как в Emacs 23,2, когда эспрессо-режим был включен в Emacs и переименован в js-mode.

Проверить это: http://www.nongnu.org/espresso/

Хороший! Я вставил (setq auto-mode-alist (cons '("\\.json\\'" . js-mode) auto-mode-alist)) в свой .emacs

Marvin 06.09.2012 16:55
(add-to-list 'auto-mode-alist '("\\.json$" . js-mode)) - то же самое, но немного короче.
ksrb 08.08.2016 23:45

js3-режим: https://github.com/thomblake/js3-mode

js3-mode - это улучшенный js2-режим

Этот пакет можно установить командой package-list-packages

Поскольку JSON является подмножеством YAML, yaml-mode тоже работает (хотя я не знаю, как он сравнивается с js-mode и json-mode).

Установить (из emacs): M-x package-install yaml-mode.

Связь yaml-mode с файлами YAML и JSON в ~/.emacs.d/init.el:

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

Я также буду вторым json-mode Джоша, но также порекомендую flymake-json в качестве дополнения. Это помогает выделить синтаксические ошибки.

Мне не нравится использовать python -mjson.tool, потому что он меняет порядок элементов в объектах JSON. Я считаю, что (prog-indent-sexp) отлично работает для повторного перехода, и при использовании jsonlint вместо python -mjson.tool работает для красивой печати / переформатирования в 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))
  )
)

Я расширил обходной путь Мариуша Новака, чтобы сделать его самостоятельным основным режимом. Требовались небольшие изменения, помимо простого получения режима; Единственное изменение, которое действительно потребовалось в работе Новака, - это способность распознавать буферы, не связанные с файлами или связанные с файлами, имена которых не заканчиваются на .json, как JSON, что мы выполняем с помощью локальной переменной буфера.

Вот расширенный обходной путь:

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

Если вы уже используете js2-режим, это может быть лучшим вариантом, чем js-mode плюс flymake-json, потому что вам не нужно устанавливать ничего нового (js2-mode уже выполняет проверку синтаксиса, нет необходимости во внешнем инструменте), и потому что этот режим унаследует ваш js2 -mode конфигурация, которой не будет js-mode.

json.el Эдварда О'Коннора является частью GNU Emacs с 23.1 (2008 г.).

Хотя это не средство выделения синтаксиса, у него есть полезная функция для форматирования JSON:

M-x json-pretty-print-buffer RET

Итак, если у вас последняя версия Emacs, нет необходимости в jq или python -m json.tool.

Используя json-pretty-print-buffer, входящий в состав GNU Emacs 24.5.1, я обнаружил, что, хотя он хорошо форматирует мой JSON, он также меняет его содержимое. К счастью, я также обнаружил, что повторный запуск его на моем JSON восстанавливает его в исходный порядок.

DavidRR 07.02.2018 22:18

Другие вопросы по теме