Как сделать отступ для данных JSON внутри TextMate, Emacs, BBEdit или Sublime Text 2?

[Обновление: через 8 часов после того, как этот вопрос был опубликован, автор пакета JSON был уведомлен об этой проблеме и исправил ее.]

У меня есть следующие данные JSON в файле application.json, показанный в конце этого поста, и я использовал TextMate с пакетом JSON, Emacs, BBEdit и Sublime Text 2, чтобы правильно сделать отступ, но все, похоже, не могли.

И TextMate, и Sublime Text 2 настаивали на том, чтобы первый { не должно быть отступ, и первая серьезная проблема заключалась в закрывающей скобке для "child": {, И TextMate, и Sublime Text 2 отказались выравнивать } под левой стороной "child": {, Emacs продолжал делать отступы все дальше и дальше для каждой строки, а BBEdit, похоже, вообще не имел функции повторного отступа (может ли это быть?).

Есть ли способ правильно сделать отступ для файла, или TextMate и Sublime Text 2 делают правильные вещи для данных JSON?

[ 
{
    "settings": [ "master" ],
    "appPort": "8666",
    "specs": {
        "frame" : {
            "type" : "HTMLFrameMojit",

            "config": {
                "deploy": true,
                "child": {
                    "type" : "HelloWorldMojit"
                    },
                    "assets": {
                        "top": {
                            "css": [
                            "/static/HelloWorldMojit/assets/index.css"
                            ]
                        }
                    }
                }
            }
        }
        },
        {
            "settings": [ "environment:development" ],
            "staticHandling": {
                "forceUpdate": true
            }
        }
        ]

9 ответов

Решение

Я только что исправил эту проблему в пакете, для пользователей 2.0 пакет должен обновляться в течение 24 часов с исправлением.

Я нашел решение для BBEdit, которое легко и хорошо работает.

Поместите следующий скрипт в
~/Library/Application Support/BBEdit/Text Filters/FormatJSON.sh

#!/bin/bash
python -m json.tool
  1. Откройте файл JSON в BBEdit. Нет необходимости перезагружать BBEdit, потому что BBEdit качается!
  2. Выберите " Текст"> "Применить текстовый фильтр"> "Формат JSON".

Я проверил это с помощью файла JSON, содержащего 3 612 683 символа в одной строке. BBEdit открыл этот файл и переформатировал, не показывая SPOD.

В BBEdit 14.0 и более поздних версиях пункт «Переформатировать документ» в текстовом меню изменит форматирование JSON. Вы также можете использовать встроенную поддержку языкового сервера с языковым сервером JSON, который поддерживает переформатирование.

Этот ответ похож на: /questions/548846/kak-sdelat-otstup-dlya-dannyih-json-vnutri-textmate-emacs-bbedit-ili-sublime-text-2/548868#548868, за исключением того, что я использую файл python для формата json. поставить следующий скрипт pretty-json.py в

~/ Библиотека / Приложение \ Поддержка /BBEdit/ Текст \ Фильтры

#!/usr/bin/env python
# You can change above she-bang line depending on your Mac configuration

import sys
import json

def main():
    input = sys.stdin.read()
    try:
        obj = json.loads(input)
    except Exception as e:
        print input + "\n\nERROR: " + str(e)
        return 1
    print(json.dumps(obj, indent=2))
    return 0

if __name__ == '__main__':
    sys.exit(main())
  1. Откройте файл JSON в BBEdit.
  2. Выберите "Текст"> "Применить текстовый фильтр"> "Pretty-json.py".

Используя приведенный выше скрипт, если вы столкнулись с какой-либо проблемой при ошибке форматирования, скрипт добавит ошибку в новый файл и не изменит исходный json

Ссылка: https://gist.github.com/brokaw/95ade1358954cd97d0f2c8e992e14b08

Для получения дополнительной информации: https://github.com/dineshbhagat/mac-configurations/tree/master/bbedit

Согласно http://jsonprettyprint.com/ Textmate и Sublime не делают правильные вещи.

Какую версию Emacs вы использовали?

С 24.2.1, ваш BLOB-объект JSON идеально подходит для отступов js-mode (Стандартный режим Emac по умолчанию для JavaScript).


Если вы занимаетесь какой-либо важной разработкой Javascript, я рекомендую проверить js2-режим https://github.com/mooz/js2-mode, который превращает Emacs в отличную JS IDE.

Возвышенный Довольно JSON

Возвышенный Pretty JSON отступ первый { Что ж. Вот что я получаю:

[
  {
    "settings": [
      "master"
    ],
    "appPort": "8666",
    "specs": {
      "frame": {
        "type": "HTMLFrameMojit",
        "config": {
          "deploy": true,
          "child": {
            "type": "HelloWorldMojit"
          },
          "assets": {
            "top": {
              "css": [
                "/static/HelloWorldMojit/assets/index.css"
              ]
            }
          }
        }
      }
    }
  },
  {
    "settings": [
      "environment:development"
    ],
    "staticHandling": {
      "forceUpdate": true
    }
  }
]

Монтаж

Внутри Sublime Text 2: Предпочтение => Управление пакетами => Установить пакет => "Pretty Json" => Перезапустить Sublime => Выбрать JSON Text => Нажмите:

  • Linux: Ctrl + Alt + J
  • Windows: Ctrl + Alt + J
  • OS X: cmd+ctrl+j

Просто проверьте, какая версия python установлена:

использование json_pretty будет работать только в том случае, если интерпретатор python установлен в вызываемой оболочке. Например, мой json_pretty работает, и я модифицировал его на Ventura следующим образом:

      #!/bin/zsh
python3 -m json.tool
  1. Создайте файл сценария fast-json-pretty.sh в ~/Library/Application\ Support/BBEdit/Text\ Filters/
  2. Вставьте следующий скрипт:
      #!/usr/bin/env bash
/usr/local/bin/jq .
  1. Примените текстовый фильтр следующим образом: Menu bar -> Text -> Apply Text Filter -> fast-json-pretty

Это переработанная версия версии JQ скрипта DKB, так как для этого, по крайней мере, для меня, требовался полный путь и точка (.) В конце.

Это решение, просто использующее Google Chrome или сам NodeJS, и вот как:

Просто откройте инструмент разработчика Google Chrome или приглашение NodeJS и введите

      obj = 

и скопируйте и вставьте в него объект, чтобы он выглядел как

      obj = [
      { 
        // etc

Теперь в Google Chrome просто введите

      JSON.stringify(obj, null, 4)

и у вас будет форматированный JSON. В NodeJS, поскольку он распечатывает \n дословно, вы можете использовать

      console.log(JSON.stringify(obj, null, 4))

Если вы хотите, чтобы отступ был всего 2 пробела, просто используйте 2 вместо 4.

Если вы хотите, чтобы отступы были табуляцией, а не пробелами, просто используйте

      JSON.stringify(obj, null, "\t")
Другие вопросы по тегам