Русский

Инструменты разработчика · JSON форматировщик и валидатор

Как работает JSON beautiful-printing: отступ, пробелы и порядок клавиш

· Как это работает

JSON рабочий процесс разработчика проверка

Как работает красивая печать JSON: отступ, пробелы и порядок ключей, проиллюстрированные с помощью токенов JSON и точной границы проверки
Оригинальная векторная иллюстрация ToolAcre

Красивая печать меняет лишь незначительные пробелы, но люди беспокоятся, что это изменяет их данные. В этом посте объясняется, к чему разрешено прикасаться форматтеру, как применяется глубина отступа и что происходит с порядком ключей.

Те же данные, три разных взгляда

Одни и те же данные, три разных вида — компактная полезная нагрузка API может занимать одну строку, расширяться на два пробела на каждую глубину или распространяться дальше на четыре. Фигурные скобки, скобки, имена и значения описывают одну и ту же анализируемую структуру в каждой версии. Различаются только разрывы строк и интервалы между структурными токенами. Это различие имеет значение при просмотре выходных данных форматтера: большая разница не является автоматически изменением данных, поскольку отступ намеренно изменяет многие байты, оставляя результирующее значение нетронутым.

ToolAcre предлагает два, четыре или восемь пробелов и табуляцию, а затем передает выбранный отступ в JSON.stringify. Короткая вложенная запись о развертывании проясняет сравнение: регионы остаются в том же порядке массива, логические значения остаются логическими значениями, а количество повторов остается числами.

Какие пробелы JSON считает несущественными

Какие пробелы JSON считает незначительными — RFC 8259 допускает пробелы, горизонтальные табуляции, переводы строк и возвраты каретки до или после структурных символов. Таким образом, форматировщик может поместить новую строку после `{`, пробелы перед вложенным элементом и еще одну новую строку перед `}` без изменения значения. Однако пробелы не являются универсально одноразовыми. Когда двойная кавычка открывает строку, каждый обычный пробел принадлежит содержимому этой строки и должен пережить форматирование точно так же, как данные.

Самая безопасная мысленная модель — отделить границы токенов от содержимого строки. Между двоеточием и числом представлены дополнительные разрешенные пробелы. Между буквами цитируемого сообщения находится информация. ToolAcre сначала анализирует источник и сериализует полученное значение, поэтому JSON.stringify выбирает новые пробелы вокруг контейнеров, сохраняя при этом декодированные строковые символы.

Как применяется настройка отступа

Как применяется настройка отступа — каждый вложенный контейнер добавляет одну копию выбранной единицы отступа. Свойство верхнего уровня начинается на одном уровне; свойство внутри своего объекта начинается на двух уровнях; объект внутри массива добавляет еще один уровень. Закрывающие скобки и скобки возвращаются в отступ контейнера, которому они принадлежат. Таким образом, ширина отражает структурную глубину, а не длину ключа, значения или предыдущей строки.

Пространства создают фиксированную визуальную ширину в каждом редакторе, а вкладка позволяет каждому зрителю выбирать ширину одного уровня. JavaScript также ограничивает отступ JSON.stringify десятью пробелами или первыми десятью символами предоставленной строки, хотя ToolAcre предоставляет только практические настройки.

Изменяет ли форматирование порядок ключей?

Изменяет ли форматирование порядок ключей? — обычная красивая печать не сортирует члены объекта намеренно. Объекты JSON концептуально являются неупорядоченными коллекциями, но при синтаксическом анализе и сериализации JavaScript используются определенные правила перечисления свойств. Таким образом, большинство нецелочисленных ключей появляются в порядке их ввода, тогда как целочисленные ключи могут создаваться перед другими именами. Потребители никогда не должны придавать деловое значение позиции члена, даже если форматтер последовательно сохраняет его для знакомых объектов.

ToolAcre отделяет отступ от сортировки. Если сортировка отключена, анализируемый объект сериализуется напрямую. При включенной сортировке он рекурсивно создает объекты, ключи которых расположены в алфавитном порядке, перед запуском JSON.stringify; массивы сохраняют порядок элементов, поскольку изменение порядка массива изменит его смысл. Этот явный параметр делает проверяемое различие: вывод только с пробелами происходит в результате красивой печати, тогда как разница в порядке ключей происходит в результате запроса канонической организации.

Что может изменить форматтер синтаксического анализа и повторной сериализации

Что может изменить форматтер с анализом и повторной сериализацией — проанализированное значение сохраняется, но его исходное написание — нет. Число, записанное как `1.0`, может вернуться как `1`, а `1e3` может вернуться как `1000`. Экранированный печатаемый символ может появиться снова буквально, тогда как буквальный символ может быть экранирован, когда этого требует сериализация. Повторяющиеся имена объектов уже свернуты во время синтаксического анализа, поэтому форматтеру остается доступным только окончательное значение свойства.

Эти преобразования объясняют, почему форматированный вывод не следует рассматривать как редактор документов, сохраняющий байты. Сравнивайте проанализированные значения, когда целью является семантическая эквивалентность, и проверяйте текстовые различия, когда исходная нотация важна для рабочего процесса подписания, хеширования или аудита. Очень большие целые числа заслуживают особого внимания, поскольку числа JavaScript могут потерять точность перед сериализацией.

Рабочий пример: форматирование вложенного объекта

Рабочий пример: форматирование вложенного объекта — начните с `{"service":{"regions":["sg","us"],"retry":{"count":3}}}` и выберите два пробела. За открывающейся корневой скобкой следует новая строка. `service` получает два ведущих пробела, его дочерние свойства получают четыре, элементы массива получают шесть, а вложенное свойство `count` также получает шесть. Каждая запятая завершает один отображаемый элемент, а каждый закрывающий разделитель выравнивается по уровню отступа его открывающего контейнера.

Переключение того же значения на вкладку изменяет только префикс, используемый для каждого уровня. Включение сортировки ключей может дополнительно поместить `regions` перед `retry`, но массив по-прежнему будет читать `sg`, а затем `us`. Полезный обзор проверяет выходные данные в два прохода: сначала убедитесь, что вложение и порядок массива представляют собой исходное значение, затем решите, соответствуют ли выбранные пробелы репозиторию.

Что это не распространяется

Чего это не касается: сортировка ключей — это отдельный выбор нормализации, а минификация — это противоположная операция представления. Pretty-printing также никогда не дает разрешения на изменение порядка массивов: позиция массива — это данные, поэтому ее изменение может изменить приоритет, хронологию или поведение программы. Отступы также не делают недействительный источник действительным перед анализом. Комментарии, конечные запятые и значения, содержащие только JavaScript, должны быть исправлены или обработаны анализатором для их фактического формата, прежде чем строгий форматировщик JSON сможет сериализовать их.

Канонические схемы JSON идут дальше обычного форматирования, определяя точный порядок элементов, написание чисел и экранирование для подписей или детерминированных хэшей. ToolAcre не претендует на реализацию такого стандарта канонизации. Он создает читаемый локальный вывод в браузере, используя JSON.parse и JSON.stringify, с дополнительной рекурсивной сортировкой ключей.

Вывод: красивая печать — это преобразование пробелов.

Вывод: красивая печать — это преобразование пробелов. Его цель — раскрыть структуру без изменения представленного значения. Ширина отступа влияет на читаемость, шум при просмотре и местные соглашения, но не на достоверность JSON. Пробелы внутри строк остаются данными, порядок массива остается значимым, а сортировка по ключам объекта требует отдельного явного выбора. Запоминание этих границ облегчает оценку различий форматтера и предотвращает путаницу косметических изменений с семантическими изменениями.

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