Объедините два и более документа JSON в один: вставьте их в поля или просто перетащите сюда несколько .json файлов. Поддерживаются глубокое слияние (вложенные объекты обходятся рекурсивно, уровень за уровнем), поверхностное слияние и склейка массивов. При конфликте ключей вы выбираете, чья сторона побеждает, а страница перечисляет каждое перезаписанное поле по отдельности. Всё выполняется локально в браузере, никакие данные не загружаются.
Перетащите сюда один или несколько файлов .json
Можно также щёлкнуть по этой области и выбрать файлы — каждый файл станет отдельным блоком ввода ниже
Способ слияния
Поля-массивы
При конфликте
Прочее
Результат слияния
Ожидание слияния
Примечания: 1. Слияние идёт сверху вниз: сначала объединяются блок 1 и блок 2, затем результат объединяется с блоком 3, и так далее. Порядок решает, кто кого перезаписывает. 2. Глубокое слияние рекурсивно обходит только те ключи, где объектами являются обе стороны. Как только одна из сторон не объект (число, строка, массив, null), по правилам выше напрямую берётся одно из значений — никаких догадок. 3. Массивы по умолчанию заменяются целиком, а не сливаются по индексам — слияние по индексам почти всегда ошибочно, см. текст ниже. 4. Режим «склейка массивов» игнорирует объектные параметры выше: все входные данные склеиваются в один массив, при этом сами массивы разворачиваются на один уровень, а всё остальное попадает туда как один элемент. 5. Перетащенные файлы никуда не загружаются — они лишь один раз читаются как текст внутри браузера.
Об объединении JSON
Чем глубокое слияние отличается от поверхностного
Поверхностное слияние смотрит только на ключи верхнего уровня: если в двух документах JSON есть одноимённый ключ верхнего уровня, поздний целиком перекрывает ранний, даже если его значение — объект глубиной в двадцать уровней. Глубокое слияние продолжает спускаться, пока объектами остаются обе стороны, и перезаписывает только тот лист, который действительно конфликтует. Для файлов конфигурации почти всегда нужно именно глубокое слияние: возьмите набор значений по умолчанию и переопределение среды из трёх строк — поверхностное слияние сотрёт и все остальные ключи той же группы, а это ровно тот случай, когда «поменял одну строку, а пропал целый блок». И наоборот, если оба документа изначально равноправные записи, поверхностное слияние быстрее и предсказуемее.
Почему массивы по умолчанию заменяются целиком
Потому что слияние по индексам почти всегда ошибочно. Индекс массива — это не идентичность: если слить ["a","b","c"] и ["x"] по позициям, получится ["x","b","c"], а такого результата обычно никто не хочет — тот, кто передал ["x"] почти наверняка имел в виду «этот один элемент и есть весь список». JSON Merge Patch (RFC 7386) определяет это так же: массив обрабатывается как одно цельное значение, поэлементного слияния не происходит. Поэтому на этой странице по умолчанию выбрано «побеждает последний», но рядом есть «склеить подряд» и «склеить и убрать дубликаты» — сшивать несколько списков действительно бывает нужно, просто это другая задача, чем переопределение конфигурации, и выбрать её нужно самому.
null — это «удалить» или «значение»?
Здесь при слиянии ошибаются чаще всего. {"a": null} может означать и «сделать a пустым», и «ключ a не трогать» — сам JSON этого не определяет. RFC 7386 трактует null как команду удаления, а большинство библиотек «глубокого слияния» считают его обычным значением и перезаписывают как обычно. Оба подхода разумны; ошибка в том, что поведение по умолчанию не проговаривается. На этой странице по умолчанию null не перезаписывает существующее значение, потому что при слиянии конфигураций это ближе к тому, чего человек и хотел. Когда нужно явно очистить поле через null, поставьте галочку «Разрешить null перезаписывать существующее значение».
Перед слиянием убедитесь, что каждый документ — валидный JSON
Ошибка, о которой сообщает инструмент слияния, часто относится вовсе не к слиянию: один из входных документов просто не разбирается — лишняя запятая в конце, одинарные кавычки, комментарии, притащенные из исходного кода. Эта страница показывает результат разбора и позицию ошибки под каждым блоком ввода отдельно, так что сначала почините покрасневший блок, а потом объединяйте. Если ввод длинный и нужно рассмотреть структуру или найти конкретную строку, открыть его в Онлайн-форматирование JSON и развернуть дерево куда быстрее, чем считать скобки в текстовом поле.
Частые вопросы
Как объединить два JSON-файла в один?
Перетащите оба .json файла в пунктирную рамку выше — каждый станет отдельным блоком ввода, после чего нажмите «Объединить». Содержимое можно и просто вставить в два текстовых поля. Слияние идёт сверху вниз, поэтому последнее слово при конфликте остаётся за тем блоком, который расположен ниже.
Можно ли объединить несколько JSON за один раз?
Да, количество не ограничено. Нажмите «Добавить блок JSON», чтобы получить ещё одно поле, или перетащите сразу несколько файлов. Слияние выполняется попарно по порядку: результат блоков 1 и 2 объединяется с блоком 3 и так далее — это равносильно последовательному наложению переопределений.
Какое значение сохраняется, если ключи называются одинаково?
По умолчанию действует «последующий перезаписывает предыдущий», то есть побеждает блок, расположенный ниже, — это соответствует привычной схеме «значения по умолчанию плюс переопределение среды». Можно переключиться на «сохраняется предыдущий»: тогда добавляются только те ключи, которые раньше не встречались. При любом варианте каждое перезаписанное поле перечисляется по отдельности над результатом.
Будет ли глубоко вложенный объект заменён целиком?
Не будет, если выбрать «глубокое слияние». Оно продолжает рекурсию, пока объектами остаются обе стороны, и перезаписывает только действительно конфликтующие листовые поля, оставляя остальное нетронутым. «Поверхностное слияние» сравнивает лишь ключи верхнего уровня, поэтому одноимённый ключ верхнего уровня заменяется целиком — оба поведения полезны, разница описана выше в разделе «Чем глубокое слияние отличается от поверхностного».
Массивы склеиваются или перезаписываются?
По умолчанию перезаписываются; в разделе «Поля-массивы» это можно поменять на «склеить подряд» или «склеить и убрать дубликаты». Дубликаты определяются по значению, поэтому убираются не только строки и числа, но и объекты с массивами (одинаковое содержимое считается повторением). Чтобы сшить несколько документов JSON прямо в один большой массив, удобнее режим «склейка массивов» вверху страницы.
Перезапишет ли поле со значением null исходное значение?
По умолчанию нет: страница считает null пометкой «этот пункт не задан» и пропускает его. Перезапись включается только галочкой «Разрешить null перезаписывать существующее значение». Оба поведения встречаются в разных библиотеках, поэтому здесь это явный переключатель, а не молча выбранный за вас вариант.
Что делать, если при слиянии сообщается об ошибке разбора?
Под каждым блоком ввода отдельно показываются состояние разбора и позиция ошибки, так что сначала посмотрите, какой блок покраснел. Чаще всего причина — лишняя запятая в конце, одинарные кавычки, комментарий // или притащенные из исходного кода True, None, undefined и прочие литералы, которых JSON не принимает.
Отправляется ли содержимое JSON на сервер?
Нет. Чтение файлов, разбор, слияние и вывод целиком выполняются локально в браузере на JavaScript, а бэкенда, способного принять содержимое, у сайта нет. Объединяя рабочие конфигурации, ответы API или файлы окружения с ключами, можно не бояться утечки: страница работает и с отключённой сетью.