Задача, которая научила меня уважать сплющивание, выглядела скучной на билете: & quot;экспортировать объект настроек в электронную таблицу, чтобы клиент мог редактировать ее. & quot; Настройки представляли собой глубоко вложенный блок JSON из конфигурации Laravel, местами на три и четыре уровня глубоко, с массивами флагов функций, смешанных в. В электронной таблице есть столбцы, а не деревья. Мне нужно было каждое листовое значение как один плоский ключ, который клиент мог видеть в одной строке, редактировать и возвращать, а затем мне нужно было восстановить точную вложенную структуру из своих правок, не теряя ни одного индекса массива. Это круговое путешествие, вложенное в плоское и плоское обратно во вложенное, - это то, что делает флэттенер JSON, и потерять его - это вся игра. Инструмент JSON-флэттенер это инструмент, который я создал для этой работы, и в этом руководстве объясняется, как он работает и где он спасает вас.
TL;DR: Флэттенер JSON преобразует вложенный объект в одноуровневый объект, ключи которого являются путем к каждому значению, т.е
{"user":{"city":"Austin"}}становиться{"user.city":"Austin"}. Массивы сплющиваются с индексом на пути (roles.0). Unflatten меняет его, восстанавливая вложенные объекты и массивы из этих пунктирных клавиш. Инструмент Toolz выполняет оба направления без потерь, сохраняет пустые объекты и массивы, поддерживает нотацию точечного или скобочного массива и собственный разделитель и работает полностью на стороне клиента без загрузки и регистрации.
Я создаю SaaS на Laravel и React и отправляю плагины WordPress, поэтому вложенный JSON повсюду в мои дни: файлы конфигурации, полезные нагрузки API, каталоги сообщений i18n, хранилища с функциональными флагами. системы, которые потребляют эти полезные нагрузки, однако, часто хотят плоские ключи. сплющивание - это адаптер между формой, которая естественна для структурированных данных, и формой, которая естественна для электронных таблиц, переменных среды и магазинов пунктирных ключей. Это небольшая операция, которая незаметно разблокирует множество других раздражающих задач.
Что такое JSON-флэттенер?
Флэттенер JSON преобразует вложенный объект JSON в одноуровневый объект, где каждый ключ представляет собой полный путь от корня к значению листа. Синтаксис пути также не является произвольным: РФЦ 6901 определяет JSON Pointer, стандартный способ обращения к одному значению внутри документа. Вложенный {"user":{"name":"Ada","address":{"city":"Austin"}}} становится плоским {"user.name":"Ada","user.address.city":"Austin"}. Ничто в ценностях не меняется; только их обращение. Каждый лист, каким бы глубоким он ни был, получает один ключ, в котором указано, как его достичь.
Массивы обрабатываются таким же образом, при этом индекс массива становится сегментом пути: {"roles":["admin","editor"]} выравнивается до {"roles.0":"admin","roles.1":"editor"}. Индекс в ключе - это то, что позволяет обратной операции восстановить массив в правильном порядке. Эта обратная операция, не сглаженная, берет плоский объект пунктирных ключей и восстанавливает вложенные объекты и массивы, на каждом этапе решая, называет ли сегмент пути свойство объекта или индекс массива. Когда сглаженные и не сглаженные используют одни и те же обозначения разделителя и массива, они являются точными обратными, и что путешествие туда и обратно без потерь является свойством, которое делает инструмент надежным для реальной работы, а не для удобства в одну сторону.
Зачем мне вообще сглаживать JSON?
Потому что многие системы говорят только плоские пары ключ-значение, и пунктирный путь является стандартным способом провести вложенную структуру через них, не теряя его. Ярчайший пример - электронная таблица. электронная таблица - это сетка столбцов, и нет столбца для & quot;город внутри адреса внутри пользователя. & quot; Сгладить объект и user.address.city становится заголовком одного столбца, под которым может жить значение, и это именно то, что нужно моему билету настройки-экспорта.
Та же форма проявляется во многих других местах. переменные среды и .env файлы плоские, и инструменты, которые сопоставляют конфигурацию с ними, используют пунктирные или подчеркнутые пути. Библиотеки интернационализации закладывают свои строки пунктирными путями, например checkout.button.label. Платформы с флагом функций, схемы событий аналитики и множество конвейеров регистрации - все они хотят один уровень ключей, часто для того, чтобы они могли индексировать или запрашивать каждое поле независимо. В каждом случае вложение реально и значимо, и сглаживание сохраняет его на пути, а не отбрасывает. Когда плоское представление выполнило свою задачу, сглаженное перестраивает исходный объект. Если вы также перемещаетесь между JSON и конкретно электронными таблицами, то Преобразователь CSV в JSON является естественным спутником табличного этапа этой поездки.
Как обрабатываются массивы при выравнивании?
Массивы - это часть, в которой люди чаще всего ошибаются, поэтому стоит быть точным. элемент массива сплющивается с использованием его числового индекса в качестве сегмента пути, что сохраняет порядок и позволяет точно перестроить массив. инструмент Toolz предлагает два обозначения для этого индекса, и они кодируют одну и ту же информацию с разным синтаксисом.
| Ввод | Точечная запись | Обозначения скобок |
|---|---|---|
{"roles":["admin","editor"]} |
roles.0, roles.1 |
roles[0], roles[1] |
{"items":[{"id":1}]} |
items.0.id |
items[0].id |
{"matrix":[[1,2]]} |
matrix.0.0 |
matrix[0][0] |
Точечная запись пишет roles.0, который компактен и соответствует тому, сколько систем config и i18n определяют свои значения. записывается запись скобок roles[0], который отражает синтаксис доступа к JavaScript и стиль пути, который используют некоторые языки запросов. Ни то, ни другое не является более правильным; вы выбираете то, что ожидает система на другом конце. Важно согласованность: с какими бы обозначениями вы ни сравняли, используйте то же самое, чтобы снять флаттен, потому что именно так инструмент знает числовой сегмент, означает "array index" а не " объектный ключ, который оказывается числом." флаттенер Toolz по умолчанию использует точечную запись и позволяет вам переключиться на скобки одним щелчком мыши.
Как мне использовать флэттенер JSON?
Поток имеет два направления и пару вариантов. начните с выбора сплющенного или неплющенного с переключателем вверху. сплющенный берет вложенные JSON и производит пунктирные клавиши; неплющенный берет пунктирные клавиши и восстанавливает вложенную структуру. образец нагрузки заполняет в обработанном примере для любого направления, в котором вы находитесь, так что вы можете увидеть форму как входа, так и выхода перед вставкой собственных данных.
Вставьте свой JSON в поле ввода. Для сплющивания это вложенный объект; для сплющивания это плоский объект, ключи которого представляют собой пунктирные пути. Вход должен быть действительным JSON, а если это не так, инструмент сообщает сообщение синтаксического анализатора 's и положение задачи вместо того, чтобы передавать вам пустой вывод, поэтому быстро найти случайную конечную запятую. Установите стиль ключа: разделитель по умолчанию имеет точку и может быть изменен, когда ваши ключи уже содержат точки, а обозначения массива переключаются между ними roles.0 а roles[0]. Сохраняйте эти две настройки одинаковыми на сплющенном и совпадающем с ним, чтобы линия туда и обратно выстроилась. Нажмите кнопку действия, проверьте количество ключей, подтверждающее, сколько листьев было выпущено, и скопируйте выходные данные или загрузите их как .json файл. Все это запускается в тот момент, когда вы нажимаете в браузере, и ничего никуда не отправляется.
Уплощение потерь лишено, и каковы крайние случаи?
Для инструмента Toolz, да, с одним краевым чехлом стоит знать. Scalars, nullлогические значения и числа сохранились нетронутыми. Тонкая часть - пустые контейнеры: пустой объект {} или пустой массив [] сохраняется как листовое значение, а не молча опускается, поэтому конфигурация, основанная на пустом списке, по-прежнему движется туда и обратно к тому, чем она была. Многие наивные плющилки теряют пустые контейнеры, что незаметно меняет смысл документа, поэтому это осознанный выбор.
Единственное подлинное ограничение - это ключи, которые уже содержат разделитель. если ваши данные имеют объектный ключ с буквальной точкой в нем, как {"a.b":1}, и вы сплющиваете с помощью разделителя точек, путь становится неоднозначным: не сплющенный не может определить, является ли a.b был одним ключом или вложенным a к тому же b. Исправление заключается в том, чтобы изменить разделитель на символ, который не отображается в ваших клавишах, например косую черту или трубку, и использовать тот же разделитель для обоих направлений. Это тот же класс проблемы выхода, которую вы видите, когда Разделители CSV сталкиваются с данными, и применяется то же решение: выберите разделитель, которого нет в ваших значениях. За пределами этого случая сплющивание, за которым следует сплющивание с соответствующими настройками, точно воспроизводит исходный документ, включая массивы и пустые контейнеры.
В чем разница между плющением и переводом в другой формат?
Сглаживание - это не преобразование формата; это реструктуризация внутри JSON. Выходной сигнал сглаживания по-прежнему остается JSON, просто с одним уровнем пунктирных клавиш вместо вложенности. Это отличается от преобразователей, которые превращают JSON в совершенно другую сериализацию, и знание того, какая из них вам нужна, экономит шаг.
Если вам нужны те же данные, что и YAML для файла конфигурации, JSON в YAML конвертер является инструментом, потому что он изменяет синтаксис, а не форму. Если вам нужен интерфейс TypeScript, описывающий структуру, чтобы ваш интерфейс знал, с чем он работает, Конвертер JSON в TypeScript делает вывод об этом из образца. Если вам нужен официальный контракт на валидацию, Генератор схем JSON выводит схему JSON из примера. Сглаживание находится рядом с ними, а не заменяет их: вы сплющиваете, когда нисходящая система хочет один уровень ключей, и вы конвертируете, когда система хочет другой язык. Я часто делаю и то, и другое последовательно, сплющивая полезную нагрузку, чтобы редактировать ее в виде столбцов, а затем отдельно генерируя типы для вложенной версии, которую я передаю React. Для красивой печати или проверки JSON в любой точке этой цепочки Форматтер JSON утилита, которую я держу открытой на следующей вкладке.
Как негласный человек решает между массивом и объектом?
Это механизм, который заставляет путешествие туда и обратно работать, и понимание его объясняет как инструмент & #39;s по умолчанию и его один острый край Когда не сплющенный читает ключ как user.roles.0, он разделяет его на сегменты user, roles, и 0, затем ходит их строя структуру как идет. на каждом шаге он смотрит на следующий сегмент, чтобы решить, какой контейнер создать. если следующий сегмент является неотрицательным целым числом, он делает массив; если это что-то еще, он делает объект. так roles.0 сообщает инструменту, что roles должен быть массивом, первым элементом которого является значение, при этом address.city говорит ему, что address должен быть объектом с city собственность.
Это единственное правило, & quot; целочисленный сегмент означает индекс массива, & quot; поэтому сплющенный и неплющенный с соответствующими настройками воспроизводят массивы точно. это также причина, по которой выбранная вами запись массива должна быть согласованной. В точечной записи индекс массива и объектный ключ - это просто текст между точками, поэтому инструмент полностью полагается на целочисленный тест. В скобочной записи [0] синтаксис делает намерение явным еще до того, как произойдет разделение. Либо работает, но смешивание их, сплющивание скобками и сглаживание точками, нарушает сигнал, от которого зависит инструмент.
Вот острый край, который следует из правила: объект, ключами которого на самом деле являются струны "0", "1", "2" неотличим, однажды сплющенный, от массива. Оба производят ключи 0, 1, 2, и unflatten перестроит их как массив, потому что это чрезвычайно распространенный случай. Если вам действительно нужен объект с числовыми клавишами строк, чтобы выжить в путешествии туда и обратно, это единственная ситуация, когда сглаживание и разглаживание не вернут вам точный тип, и вам лучше сохранить этот объект вложенным или использовать схему нечислового ключа. За годы этого я попал в этот случай ровно дважды, оба раза в данных, которые, возможно, были смоделированы неправильно, поэтому по умолчанию это правильная сделка почти для всех. Это такое же прагматичное решение, что и сохранение чисел с ведущими нулями в качестве строк Преобразователь CSV в JSON: инструмент оптимизирует то, что почти всегда означают данные, и документирует редкое исключение, а не делает общий путь неудобным.
Безопасно ли вставлять мой JSON в этот инструмент?
Да, и это скорее архитектурно, чем многообещающе. анализируя, выравнивая, разглаживая, и сериализуя все запускать как JavaScript внутри вашей собственной вкладки браузера. нет никакой загрузки, ни сервера туда и обратно, и ничего не регистрируется или не хранится.Откройте свой браузер 's вкладка сети и нажмите кнопку действия: ни один запрос не погаснет. как только страница загрузилась вы можете отключиться от Интернета и он продолжает работать, потому что никогда не было сервера в цикле, чтобы начать с.
Это имеет большее значение, чем может показаться, потому что полезные нагрузки JSON - это именно то, что несет секреты: токены API в конфигурации, персональные данные в ответе API, внутренние идентификаторы в блобе настроек. флэттенер, загрузивший ваш объект на сервер, превратил бы частную полезную нагрузку в кого-то другого и #39;s log line.Обработка на стороне клиента полностью снимает риск, поэтому это по умолчанию для каждого инструмента на Toolz.dev.Если вы хотите получить полное обоснование, я изложил это в руководство по конфиденциальности данных для онлайн-инструментови более широкий комплект, который я использую для такого рода работы, находится в моем Руководство по набору инструментов для разработчиков веб-разработчика, йо-
Часто задаваемые вопросы
Что значит сгладить JSON?
Сглаживание JSON преобразует вложенный объект в одноуровневый объект, ключи которого являются путем к каждому значению Вложенный {"user":{"city":"Austin"}} становится плоским {"user.city":"Austin"}. Каждое значение листа получает один пунктирный ключ, и на выходе не остается вложенности. Unflatten меняет процесс и восстанавливает вложенную структуру.
Как обрабатываются массивы при выравнивании?
Элементы массива сплющивают с использованием их индекса в качестве отрезка пути. {"roles":["admin","editor"]} становиться {"roles.0":"admin","roles.1":"editor"} в точечной записи, или {"roles[0]":"admin","roles[1]":"editor"} в скобках обозначение. индекс сохраняет порядок, поэтому массив можно перестроить точно тогда, когда вы расплющиваетесь.
Могу ли я снять пунктирные клавиши обратно во вложенный JSON? Да. Переключитесь в режим unflatten и вставьте плоский объект, ключи которого пунктирные пути Инструмент перестраивает вложенные объекты и массивы, решая массив против объекта, по тому, является ли каждый сегмент пути целочисленным индексом. Flatten и unflatten являются точными обратными, когда разделитель и обозначение массива совпадают.
В чем разница между обозначениями точечного и скобочного массивов?
Оба кодируют один и тот же индекс массива; различается только синтаксис. Точечная запись пишет items.0.id, который компактен и распространен в config и i18n ключах. записывает обозначение скобок items[0].id, который соответствует синтаксису доступа JavaScript и некоторым языкам запросов. выберите, какую целевую систему ожидает, и используйте одну и ту же для обоих направлений.
Уплощение теряет какие-либо данные? Нет. Скаляры, нули, логические значения и даже пустые объекты и пустые массивы сохраняются в виде листовых значений, поэтому разглаживание результата воспроизводит исходный документ. Единственное, что нужно смотреть, - это ключи, которые уже содержат ваш разделитель, поэтому разделитель можно настроить.
Зачем мне сплющивать JSON? Сглаживание адаптирует вложенные данные к системам, которые ожидают один уровень ключей: столбцы электронных таблиц, переменные среды, пунктирные клавиши перевода, хранилища с флагами функций, а также множество конвейеров аналитики и регистрации. Пунктирный путь передает исходную структуру через плоский формат, поэтому ничего не теряется.
Что произойдет, если ключ уже содержит точку? Буквальная точка внутри ключа неоднозначна с разделителем пути, поэтому путешествие туда и обратно может разделить его в неправильном месте. Измените разделитель на символ, который не отображается в ваших клавишах, например косую черту или трубку, и используйте тот же разделитель как для сплющенных, так и для несплющенных.
мой json где-нибудь загружен? Нет. Анализ и преобразование запускаются как JavaScript в вашем браузере. Ничего не передается, не регистрируется и не сохраняется. Вы можете подтвердить это, наблюдая за вкладкой сети во время выравнивания или выходя из сети, поскольку инструмент продолжает работать без подключения.



