Режим Emacs для редагування JSON


75

Хтось знає хороший режим Emacs для редагування JSON? Додаток, над яким я працюю, використовує протокол зв'язку на основі JSON, і якщо дані мають гарний відступ та виділення синтаксису, це дуже допомогло б мені в процесі з’ясування цього.


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

Відповіді:



34

+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
Чад

Я попросив виправити удате, що не є ASCII, на github.com/joshwnj/json-mode/issues/5
Jarl

Остання версія json-mode тепер виправила проблему utf-8: див. Github.com/joshwnj/json-mode/issues/5
Jarl

1
Це все працює, встановлюючи останній пакет json-mode на melpa . Гарна робота хлопці.
TooTone

не використовувати "unicode_escape"з вмістом json. Використовуйте ensure_ascii=Falseзамість цього.
jfs

29

js-режим підтримує виділення синтаксису та відступ для файлів json.

Це станом на Emacs 23.2 , коли режим еспресо був включений в Emacs і перейменований в js-режим.

Перевірте: http://www.nongnu.org/espresso/


6
Приємно! Я поклав (setq auto-mode-alist (cons '("\\.json\\'" . js-mode) auto-mode-alist))свій.emacs
Марвін

(add-to-list 'auto-mode-alist '("\\.json$" . js-mode))це те саме, але трохи коротше.
ksrb

15

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

Це насправді не більше ніж додаткове підсвічування синтаксису поверх режиму javascript, але для моїх цілей я виявив, що він працює досить добре.

Інший поширений випадок використання - це автоматичне форматування файлу JSON (наприклад, якщо він стиснений пробілами і ви хочете отримати більше читабельності). Для цього я просто прокладаю буфер через сценарій командного рядка: Cu M- |


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

FWIW Джош прийняв запит Чада на включення додавання jstevenco (отримав усе це?), Тому на момент написання статті репозиторій Джоша в режимі json на github є найсучаснішим джерелом для json-mode.
Стівен Коллінз

Заяви застосовують виправлення, яке не відповідає ASCII.
Jarl

Це помилка чи я роблю щось не так? emacs.stackexchange.com/q/17319/4003 (я завантажую json-mode у своєму .emacs)
Маркус Юній Брут,

9

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

(Я хотів опублікувати його як коментар до рішення JF Sebastian, але, схоже, мені це не дозволено (немає посилання "додати коментар"))


5

json.el Едвардом О'Коннором є частиною GNU Emacs з 23.1 (2008).

Хоча це не підсвічувач синтаксису, він має корисну функцію для форматування JSON:

M-x json-pretty-print-buffer RET

Отже, якщо у вас остання версія Emacs, немає необхідності в jqабо python -m json.tool.


1
Використовуючи json-pretty-print-bufferдоданий до GNU Emacs 24.5.1, я виявив, що, хоча він добре форматує мій JSON, він також змінює свій вміст. На щастя, я також виявив, що запуск його вдруге на моєму JSON відновлює його початковий порядок.
DavidRR

3

Оскільки 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))

0

JSON підтримується режимом еспресо


2
Я можу отримати лише режим еспресо для роботи з легальним синтаксисом Javascript. Наприклад, вирази JSON не відступають належним чином.
ESV

Еспресо було включено до GNU Emacs, починаючи з версії 23.2, і було перейменовано в js-mode. режим еспресо більше не підтримуватиметься поза межами власності Emacs.
Джефф Бауер,


0

Я також підтримаю json-режим Джоша, але також рекомендую 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))
  )
)

0

Я розглянув обхідний шлях Маріуша Новака , щоб зробити його придатним як основний режим самостійно. Потрібні були незначні модифікації, крім простого виведення режиму; єдиною зміною дійсно необхідної роботи Новака була здатність розпізнавати буфери, не пов'язані з файлами або пов'язані з файлами, імена яких не закінчуються на.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-режим вже виконує перевірку синтаксису, немає необхідності в зовнішньому інструменті), і оскільки цей режим успадкує ваш js2-режим конфігурації, якого js-режиму не буде.


-7

Я також рекомендую js2-режим.

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

10
Якщо бути точним, наведений вами приклад - це не JSON, а літерал об’єкта JavaScript, який схожий, але різний.
viam0Zah,

6
Інша мова, яка є контейнером даних, наприклад YAML або XML, - це саме те, що насправді є JSON, і JSON не дозволяє функції.
Краген Хав'єр Сітакер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.