Запрос на вытягивание имел 240 измененных строк, и я коснулся ровно двух значений. Это был момент, когда я серьезно подошел к сортировке ключей JSON. Товарищ по команде запустил файл конфигурации через форматировщик, который переупорядочил свои ключи, я отредактировал два из этих значений вручную, и в результате diff была нечитаемая стена красного и зеленого, где 238 строк были ключами, которые просто двигались. Мой рецензент, понятно, попросил меня переделать это. Реальные изменения были невидимы внутри шума.
Я запускаю [Toolz.dev](/а также строю проекты Laravel и WordPress, а значит, живу внутри package.json, composer.json, tsconfig.json, каталоги переводов, и сотня других файлов JSON, которые получают приверженность к контролю версий.JSON файл с непредсказуемым порядком ключей является небольшим, повторяющимся налогом на каждый из тех.Сортировка ключей в стабильный алфавитный порядок является исправлением, и это одно из тех изменений, которые выглядят косметическими до тех пор, пока он впервые не сохранит вам потраченный впустую обзор кода.Это руководство охватывает, когда сортировать ключи JSON, когда не делать, и как сделать это, ничего не нарушая.
TL;DR: Сортировщик JSON переупорядочивает ключи объекта & #39;s в алфавитном порядке и повторно сериализует результат. порядок ключей не меняет того, что означает JSON, потому что объекты не упорядочены стандартом JSON, но последовательный порядок делает файлы читаемыми и создает чистые различия управления версиями, которые показывают только измененные значения. Сортируйте рекурсивно, чтобы достичь вложенных объектов, поддерживайте порядок массивов по умолчанию, потому что массивы упорядочены, и выбирайте возрастающий или убывающий, красивый или минифицированный вывод.The Сортировка JSON полностью работает в вашем браузере.
Что такое сортировщик JSON?
Сортировщик JSON берет объект JSON и переставляет его ключи в алфавитный порядок, затем записывает объект обратно Значения нетронуты Меняется только последовательность, в которой появляются ключи, и это безопасно, потому что RFC 8259 определяет объект как неупорядоченную коллекцию: переупорядочение ключей не может изменить то, что означает документ. так {"name":"toolz","author":"Liton"} становиться {"author":"Liton","name":"toolz"}. По умолчанию сортировка является рекурсивной, что означает, что ключи внутри каждого вложенного объекта также сортируются вплоть до самого глубокого уровня.
В этом вся операция, и в ней простота - дело. вы не преобразуете данные, не проверяете схему и не преобразуете формат. вы навязываете предсказуемый порядок чему-то, что имело произвольный. Все остальные преимущества, читаемость, сопоставимость, чистые различия вытекают из этого единого предсказуемого порядка.
Изменяет ли сортировка ключей то, что означает мой json?
Нет, и это тот факт, что делает сортировку безопасной В стандарте JSON, ECMA-404, объект определяется как неупорядоченный набор пар имен и значений. спецификация явная, что порядок этих пар не является существенным. любой соответствующий синтаксический анализатор читает {"a":1,"b":2} а {"b":2,"a":1} как точно такие же данные Когда ваша программа делает config.timeout или data["name"], он ищет ключ по имени; его никогда не волнует, где в объекте был написан этот ключ.
Есть одна оговорка, которую стоит четко заявить, потому что кто-то всегда спрашивает. крошечное количество систем злоупотребляют объектами JSON, как если бы они были заказаны, полагаясь на порядок вставки для отображения или обработки. это неправильное использование формата, а не его свойство, но если вы подаете систему, которую не контролируете, протестируйте, прежде чем отправлять отсортированный файл в конвейер, который вы не можете проверить. Для подавляющего большинства реальных JSON файлы конфигурации, полезные нагрузки API, файлы блокировки, каталоги переводов, сортировка ключей - это чисто презентационное изменение с нулевым влиянием на смысл.
Массивы - это противоположный случай, и различие имеет значение. массив JSON упорядочен по определению, и его порядок часто несет в себе значение: последовательность шагов, ранжированный список, набор координат, где позиция один - долгота, а позиция два - широта. переупорядочение массива может молча изменить то, что говорят данные. именно поэтому этот инструмент сохраняет порядок массива по умолчанию и сортирует массивы только тогда, когда вы явно запрашиваете его, и даже тогда только для массивов, элементы которых все строки или все числа.
Зачем мне сортировать ключи json?
Заголовок причина чистые различия, и это тот, который изменил, как я работаю. инструменты контроля версий сравнивают файлы строка за строкой. когда два файла, которые представляют одни и те же данные, пишут свои ключи в разных порядках, diff полон ключей, которые перемещались, а не значений, которые изменились.Принять правило, что каждый файл JSON написан сортированными ключами, и проблема исчезает: две версии файла отличаются только там, где значение действительно отличается, поэтому рецензент видит реальное изменение немедленно. именно поэтому многие лайнеры и форматировщики предлагают опцию сортировки ключей, и почему инструменты, как jq отправьте флаг сортировочных ключей.
Вторая причина - читаемость человеком Когда вы сканируете большой файл конфигурации в поисках определенного параметра, алфавитный порядок говорит вам, где искать Вы не читаете весь файл; вы переходите примерно туда, где должен быть ключ, так, как вы бы в словаре На файле с восемьюдесятью ключами, это разница между двухсекундным поиском и полным сканированием.
Третья причина - сопоставимость между файлами Если в вашем проекте десять файлов JSON, которые должны иметь общую структуру, сортировка их одинаково делает тривиальным глазное яблоко, не хватает ли ключа или есть лишний. расхождения выстраиваются в линию рядом друг с другом вместо того, чтобы прятаться в разных позициях.
Четвертая причина - канонизация. Некоторым рабочим процессам необходимо стабильное детерминированное представление значения JSON, например, чтобы хешировать его, кэшировать или сравнивать две полезные нагрузки для обеспечения равенства независимо от того, как они были сериализованы. Сортировка ключей - это один шаг к канонической форме, хотя полный канонический JSON также нормализует формат пробелов и чисел.
Как мне использовать JSON Sorter?
Вставьте свой JSON в поле ввода на Сортировка JSON, или загрузить образец, чтобы увидеть форму вывода. вход должен быть действительным JSON. если это не так, инструмент сообщает об ошибке синтаксического анализа своим положением, чтобы вы могли исправить случайную запятую или незакрытый кронштейн перед сортировкой.
Затем выберите, как выполняется сортировка. Выберите возрастание, что означает от A до Z, или снижение для Z до A. Решите, следует ли складывать регистр, который включен по умолчанию, чтобы Name, name, и NAME сидите вместе, а не разделяйтесь, потому что прописные буквы сортируются перед строчными в порядке необработанных символов. выбирайте, спускаться ли во вложенные объекты, которые вы почти всегда хотите, или сортировать только верхний уровень. если вам нужны массивы строк или числа, упорядоченные также, включите сортировку массивов; смешанные массивы и массивы объектов всегда оставляют такими, какие они есть.
Наконец, выберите свой стиль вывода. Pretty-print с двухпространственным, четырехпроходным или табуляционным отступом для читаемого файла, который вы зафиксируете, или minify to a single line для наименьшей полезной нагрузки для хранения или транспортировки.Запустите сортировку, затем скопируйте результат или загрузите его. счетчик ключей говорит вам, сколько ключей было переупорядочено, что является быстрой проверкой здравомыслия, что инструмент увидел структуру, которую вы ожидали.
Восходящий, нисходящий, рекурсивный: какие настройки я хочу?
Большую часть времени по умолчанию это то, что вы хотите: восходящий, рекурсивный, нечувствительный к регистру, довольно-таки напечатанный с двумя пробелами. который производит читаемый, удобный для различий файл, который мотивирует сортировку в первую очередь. другие настройки существуют для конкретных ситуаций, и таблица ниже - это то, как я решаю.
| Настройка | Дефолт | Когда менять |
|---|---|---|
| Порядок | Восхождение (от А до Я) | Снижение встречается редко; полезно, когда вам нужны самые последние или самые приоритетные ключи, названные для сортировки последними, вверху |
| Рекурсивный | На | Выключайте только тогда, когда вы хотите изменить порядок разделов верхнего уровня, но сохраняйте вручную настроенный порядок внутри каждого из них |
| Игнорировать дело | На | Выключите, когда вам понадобится строгий порядок кодовых точек, например, чтобы соответствовать другому инструменту, который сортирует случай с учетом особенностей |
| Сортировать массивы | Выключить | Включите массивы, которые представляют собой действительно неупорядоченные наборы, например список тегов или разрешенных значений |
| Довольно принт | На | Выключите для минификации для транспортировки или хранения |
Один параметр, который люди неправильно используют, - это сортировка массива. Включите его только тогда, когда вы уверены, что массив представляет неупорядоченный набор. Список тегов, набор разрешенных расширений файлов или пакет флагов функций безопасно сортировать. Список шагов конвейера, таблица маршрутов или что-либо еще, где позиция подразумевает, что последовательность отсутствует. Если есть сомнения, оставьте массивы в покое, потому что инструмент и № 39; по умолчанию сохраняющий порядок никогда не может повредить ваши данные, а сортировка неправильного массива может сделать это бесшумно.
Как это сочетается с другими инструментами JSON?
Сортировка обычно один шаг в небольшой цепочке Когда JSON приходит миниатюрный и нечитаемый из API, я запускаю его через Форматтер JSON сначала отступите и проверьте его, затем отсортируйте ключи, чтобы сделать его сканируемым. Когда я готовлю полезную нагрузку для транспортировки после сортировки, Минификатор JSON убирает его обратно в одну строку, а поскольку ключи уже отсортированы, две минифицированные полезные нагрузки, представляющие одни и те же данные, оказываются побайтно идентичными, что удобно для кэширования и сравнения.
Для структурной работы, а не для презентации JSON-флэттенер превращает вложенные объекты в пунктирные клавиши и обратно, которые естественным образом сочетаются с сортировкой, когда вы перебираете конфигурацию в переменные среды. А когда вам нужны данные полностью в другом формате, JSON в YAML конвертер это следующая остановка; сортировка ключей перед конвертированием дает вам файл YAML с предсказуемым, читаемым порядком полей. Если вам нужна более широкая картина того, как они сочетаются друг с другом, я изложил свою полную настройку в Руководство по набору инструментов для разработчиков веб-разработчика, и более глубокая механика форматирования живет в Руководство по форматированию JSON, йо-
Настоящий пример: приручение package.json diff
Позвольте мне пройтись по точной ситуации, с которой началась эта статья, потому что она показывает, почему выбор настройки имеет значение. У меня был package.json где dependencies блок был написан в порядке установки, примерно в том порядке, в котором пакеты добавлялись в течение двух лет. Новый член команды запустил свой редактор и формат № 39;s, который отсортировал ключи зависимости и зафиксировал это вместе с реальным изменением: нажатием одного пакета с версии 4 на версию 5.
Дифф был катастрофой.Каждая зависимость ниже неровной, казалось, сдвинулась, потому что сортировка сместила их позиции, поэтому рецензент увидел тридцать измененных строк для того, что было однострочным обновлением. исправление заключалось не в том, чтобы спорить о том, чей редактор был прав. исправление заключалось в том, чтобы отсортировать файл один раз, зафиксировать этот сорт как отдельное изменение с сообщением, как "sort package.json ключи, & quot; а затем сделать так, чтобы версия не ударялась поверх теперь стабильного порядка. После этого каждое будущее изменение зависимости производило чистый однострочный или двухстрочный дифф, потому что файл уже был в порядке все и #39;s инструменты хотели его поместить.
Это шаблон, которому я сейчас следую для любого JSON, который живет в управлении версиями. Сортируйте его один раз в выделенном коммите, затем продолжайте сортировать. The Сортировка JSON с его по умолчанию, восходящий и рекурсивный, производит именно тот порядок, который Prettier's сортировать опцию и jq --sort-keys производить, поэтому файл остается стабильным независимо от того, какой инструмент случайно запускает товарищ по команде Единственное, что я проверяю первым, это массивы: package.json не имеет значимых массивов, о которых можно беспокоиться, но файл с упорядоченным массивом, например списком шагов сборки, требует оставленной сортировки массива, что является стандартом по умолчанию, поэтому последовательность сохраняется.
Какие инструменты и форматы сортируют ключи JSON?
Сортировка ключей JSON - достаточно распространенная потребность, чтобы она проявлялась во всей экосистеме, что является хорошим признаком того, что практика является разумной, а не личной причудой. Процессор командной строки jq имеет a --sort-keys флаг, часто пишется -S, что сортирует ключи каждого объекта в его выходе. форматировщик кода Prettier может сортировать ключи в JSON через его конфигурацию. многие линтеры предлагают правило ключей сортировки, которое помечает несортированные объекты в исходном коде. стандартные библиотеки языка предоставляют ту же возможность, например Python's json.dumps принимает а sort_keys=True аргумент, который создает канонический, отсортированный вывод.
То, что браузерный сортировщик добавляет, это быстрый, без настройки случай, Когда у вас есть blob JSON из ответа API, строка журнала или Slack сообщение, и вы просто хотите прочитать его в здравом порядке прямо сейчас, открытие страницы и вставка быстрее, чем подключение форматировщика или падение в оболочку. это та же самая причина, по которой past-and-go форматировщик существует рядом с плагинами редактора: инструмент удовлетворяет ad-hoc потребность, что настроенный конвейер не покрывает.
Мой JSON частный?
Да. JSON анализируется, сортируется и повторно сериализуется полностью в вашем браузере с помощью JavaScript. Ничто не загружается на сервер, не регистрируется и не сохраняется где-либо. Это не второстепенная деталь для JSON конкретно, потому что JSON - это место, где живут секреты: ответы API, содержащие токены, файлы конфигурации со строками соединения, полезные нагрузки, содержащие записи клиентов. Вставка любого из этого в инструмент, который отправляет его на сервер, представляет собой реальный риск, и именно такого риска этот инструмент создан, чтобы избежать.
Вы можете проверить претензию так же, как я бы. Откройте вкладку сети в вашем браузере и #39;s инструменты разработчика и посмотрите ее, пока вы сортируете; ни один запрос не покидает страницу. Или отключитесь от Интернета и продолжайте сортировать, потому что после загрузки страницы инструмент работает вообще без подключения. Обработка на стороне клиента является по умолчанию для всего, что я создаю, и если вас волнует более широкий аргумент в пользу этого, то Руководство по конфиденциальности данных обосновывает это полностью.
Часто задаваемые вопросы
Что значит сортировать ключи json?
Сортировка ключей JSON переупорядочивает пары имя-значение объекта в алфавитном порядке без изменения каких-либо значений. Объект {"name":"toolz","author":"Liton"} становится {"author":"Liton","name":"toolz"}. меняется только порядок ключей, поэтому данные, которые представляет документ, остаются точно такими же.
Изменяет ли сортировка ключей то, что означает мой json?
нет , йо- В стандарте JSON, ECMA-404 объект является неупорядоченным набором пар имени-значения, поэтому изменение его ключей не меняет его значения. Любой подходящий парсер читает отсортированные и несортированные версии как те же данные. Заказ имеет значение только для читаемости человека и для создания стабильных дифференциалов.
Вложенные объекты тоже сортируются?
Да по умолчанию. Включена рекурсивная сортировка, поэтому ключи каждого объекта внутри документа сортируются на каждом уровне вложенности. Вы можете отключить рекурсию, чтобы отсортировать только ключи верхнего уровня и оставить вложенные объекты в их первоначальном порядке.
Сортировка меняет порядок массивов?
Не по умолчанию. Массивы упорядочены по определению, и их изменение порядка может изменить значение, поэтому инструмент сохраняет порядок массивов. Существует возможность сортировки массивов, элементы которых являются строками или всеми чиселами, когда вы хотите их упорядочить; массивы, которые смешивают типы или содержат объекты, всегда остаются такими, какие они есть.
Зачем мне сортировать ключи json?
Наиболее распространенной причиной являются стабильные дифференциалы: когда каждый файл записывает свои ключи в одном алфавитном порядке, дифференциалы управления версиями выделяют только те значения, которые изменились, а не ключи, которые перемещались. Сортировка также значительно упрощает сканирование и сравнение больших конфигурационных файлов и ответов API.
Как работает сортировка без учета регистра?
При включенной сортировке без учета ключи сравниваются как в нижнем регистре, поэтому имя, имя и имя группируются рядом друг с другом, а не разделяются, поскольку прописные буквы сортируются перед строчными буквами в порядке необработанного символа. Отключите его, чтобы сортировать строго по кодовой точке.
Могу ли я минимизировать отсортированный JSON?
да. Выберите миниатюрный вывод, чтобы получить отсортированный JSON в одной строке без дополнительных пробелов, что является наименьшей формой для хранения или транспортировки. Для читаемого файла выберите Pretty Output с двумя пробелами, четырьмя пробелами или отступом вкладки.
мой json где-нибудь загружен?
нет , йо- JSON анализируется и сортируется по JavaScript в вашем браузере и никогда не передается, регистрируется или сохраняется. Вы можете проверить это, просмотрев вкладку «Сеть» во время сортировки или отключив его, инструмент продолжает работать без подключения.
Написано Liton, разработчиком [Toolz.dev](/. Я создаю инструменты для разработчиков на основе браузера и пишу о работе с JSON, Laravel и Интернетом.



