Объединение JSON
Бесплатный онлайн-инструмент для объединения JSON: объединяет несколько JSON-объектов по выбранной стратегии (глубокое/поверхностное слияние, конкатенация/замена массивов), 4 режима разрешения конфликтов. Подходит для агрегации данных из нескольких источников, наслоения конфигов, слияния i18n и других сценариев.
Похожие
Что такое объединение JSON (JSON Merge)?
JSON Merge (объединение JSON) — это операция слияния двух или более JSON-объектов по определённым правилам в один новый объект. Она чрезвычайно часто встречается в разработке: ① объединение JSON-ответов от нескольких микросервисов в единый ответ (агрегация на уровне BFF); ② слияние базовой конфигурации, конфигурации окружения и пользовательских настроек по логике «перекрытие по среде» в итоговый конфиг (Node.js config, Viper, Spring Cloud Config); ③ объединение, перекрытие и дополнение нескольких i18n-файлов переводов в полный словарь; ④ слияние нескольких массивов mock-данных в полный тестовый набор; ⑤ объединение ответов API с пагинацией в полный результат.
Сложность объединения не в самом «слиянии», а в «разрешении конфликтов». Существует 4 основные стратегии: ① **Глубокое слияние (Deep Merge)**: рекурсивный обход вложенных объектов, слияние по каждому ключу отдельно, перезапись только при конфликте листовых узлов — подходит для наслоения конфигов; ② **Поверхностное слияние (Shallow Merge)**: сливаются только ключи верхнего уровня, одноимённые ключи перезаписываются целиком — простейшая семантика, аналог `Object.assign`; ③ **Конкатенация массивов (Array Concat)**: значения-массивы объединяются в один длинный массив с сохранением порядка всех элементов — подходит для агрегации API; ④ **Замена массивов (Array Replace)**: значения-массивы полностью заменяются последним введённым — подходит для перекрытия конфигов.
На уровне реализации глубокое слияние обычно использует стековую рекурсию: сначала проверяется, что обе стороны являются обычными объектами (не массивами, не null), затем для каждого ключа запускается рекурсивная обработка; при несовпадении типов (например, один ключ — объект, другой — массив) применяется правило «последний ввод имеет приоритет», преобразование типов не производится. Инструмент JSON Merge от GeekFormat имеет встроенные 4 стратегии с возможностью переключения прямо на странице; можно вставить от 2 до N фрагментов JSON, они автоматически объединяются по порядку, результат выводится в отформатированном виде. Весь процесс слияния выполняется локально в браузере, исходные данные не загружаются на сервер.
Варианты использования
- Объединение ответов API от нескольких микросервисов в единую JSON-структуру для использования фронтендом
- Агрегация многоуровневых конфигурационных файлов base/dev/prod с перекрытием по окружению для генерации итогового конфига
- Слияние, дедупликация и дополнение нескольких i18n-файлов переводов по языкам в полный словарь
- Объединение нескольких массивов mock-данных или ответов пагинированных API в полный набор данных
- Слияние дефолтной конфигурации фронтенд-компонента + пользовательских настроек + удалённой конфигурации A/B-экспериментов
- При миграции данных объединение JSON-экспортов из нескольких исходных систем в единый формат для последующей обработки
Как использовать
- Вставьте от 2 до N фрагментов JSON для объединения последовательно в левые поля ввода (по умолчанию 2 поля) или нажмите «+» для добавления новых полей
- Выберите стратегию слияния в выпадающем списке на панели инструментов: глубокое слияние (Deep) / поверхностное слияние (Shallow) / конкатенация массивов (Array Concat) / замена массивов (Array Replace)
- Нажмите кнопку «Объединить», в правом поле вывода отобразится отформатированный результат; при синтаксических ошибках во вводе будут показаны конкретный номер строки и сообщение об ошибке
- После проверки результата нажмите «Копировать» для помещения объединённого результата в буфер обмена или «Скачать» для сохранения в файл merged.json с последующей обработкой форматированием, валидацией Schema и т.д.
Функции
- 4 стратегии слияния: глубокое слияние / поверхностное слияние / конкатенация массивов / замена массивов — переключение одним кликом для разных бизнес-сценариев
- Поддержка от 2 до N фрагментов JSON: по умолчанию 2 поля ввода, можно нажимать «+» для динамического добавления исходных JSON, гибкая адаптация к многоисточниковой агрегации
- Глубокое рекурсивное слияние: интеллектуальная обработка многоуровневых вложенных объектов, разрешение конфликтов листовых узлов по выбранной стратегии с сохранением всех валидных полей
- Гибкое разрешение конфликтов: конфликты верхнего уровня разрешаются по выбранной стратегии; конфликты вложенных объектов обрабатываются глубоким слиянием; конфликты массивов обрабатываются через arrayConcat/arrayReplace
- Единое форматирование вывода: результат слияния отображается с отступом в 2 пробела, удобно для ручного просмотра и прямого копирования в последующие инструменты
- Слияние в реальном времени: после вставки нажмите «Объединить» для получения результата, при ошибках отображаются конкретный номер строки JSON и сообщение об ошибке
- Локальная обработка для защиты приватности: парсинг, слияние и форматирование полностью выполняются локально в браузере, вводимые данные не отправляются ни на какие серверы
- Бесшовная интеграция с последующими инструментами: результат слияния можно одним кликом скопировать в инструменты форматирования JSON, валидации Schema, генерации кода и другие для дальнейшей обработки
Примеры кода
Глубокое слияние в JavaScript с помощью lodash merge
javascript// npm install lodash.merge
import merge from 'lodash.merge';
const a = { user: { name: 'Alice', age: 28 }, tags: ['admin'] };
const b = { user: { email: 'a@x.com', age: 29 }, tags: ['editor'] };
// Глубокое слияние: вложенные объекты рекурсивно объединяются, листовые узлы последующего ввода перезаписывают предыдущие
const deep = merge({}, a, b);
console.log(deep);
// => { user: { name: 'Alice', age: 29, email: 'a@x.com' }, tags: ['admin', 'editor'] }
// Поверхностное слияние: ключи верхнего уровня перезаписываются целиком, без входа во вложенные структуры
const shallow = Object.assign({}, a, b);
console.log(shallow);
// => { user: { email: 'a@x.com', age: 29 }, tags: ['editor'] }Глубокое слияние в Python с помощью mergedeep
python# pip install mergedeep
from mergedeep import merge
a = {"user": {"name": "Alice", "age": 28}, "tags": ["admin"]}
b = {"user": {"email": "a@x.com", "age": 29}, "tags": ["editor"]}
# Глубокое слияние
result = merge(a, b)
print(result)
# => {'user': {'name': 'Alice', 'age': 29, 'email': 'a@x.com'}, 'tags': ['admin', 'editor']}
# Примечание: mergedeep по умолчанию объединяет массивы, строки/числа перезаписывает
# Для замены массивов добавьте strategy='override'Объединение нескольких JSON в командной строке с помощью jq -s
bash# Объединение нескольких JSON-массивов в один длинный массив
jq -s 'add' a.json b.json c.json
# Рекурсивное объединение нескольких JSON-объектов (jq 1.6+)
jq -s 'reduce .[] as $item ({}; . * $item)' a.json b.json
# Поверхностное слияние: ключи верхнего уровня из b перекрывают a
jq -s '.[0] * .[1]' a.json b.json
# После объединения массивов оставить только уникальные по полю id
jq -s '[.[].items[]] | unique_by(.id)' a.json b.jsonЧасто задаваемые вопросы
Объединение JSON и конкатенация JSON — это одно и то же?
Не совсем. «Конкатенация» обычно означает прямое соединение строк без учёта структуры; «объединение» означает рекурсивное слияние нескольких объектов в один с учётом структуры JSON и обработкой конфликтов имён ключей. Данный инструмент относится ко второму типу — структурному объединению JSON.
Как выбрать между глубоким и поверхностным слиянием?
Поверхностное слияние: обрабатывает только ключи верхнего уровня, одноимённые ключи заменяются целиком, аналогично `Object.assign`, самое простое и прямое. Глубокое слияние: рекурсивно обходит вложенные объекты, объединяет каждый листовой узел отдельно, более интеллектуальное. Если ваши JSON добавляют поля в разных подпутях (например base.user.name и override.user.email), используйте глубокое слияние; если нужно заменить весь подобъект за раз — используйте поверхностное.
При слиянии массивов используется порядок или индекс?
Инструмент по умолчанию использует семантику «конкатенации»: несколько массивов объединяются в один длинный с сохранением порядка всех элементов. Если ваши два массива одинаковой длины и вы хотите перезапись по индексу, переключитесь на «arrayReplace» и вручную оберните массивы в объектную структуру.
При конфликте имён ключей кто кого перезаписывает?
Порядок ввода определяет приоритет: последующие JSON перезаписывают одноимённые ключи предыдущих (при стратегии поверхностного слияния/замены массивов — полная перезапись, при глубоком слиянии — перезапись только листовых узлов). Если вы хотите приоритет «первого ввода», просто поменяйте порядок ввода.
Поддерживается ли слияние JSON-массивов?
Поддерживается. Два типичных сценария: ① несколько JSON являются массивами → используйте «arrayConcat» для объединения в один длинный массив; ② несколько JSON являются объектами, где определённое поле — массив → используйте «arrayConcat» для объединения массивов или «arrayReplace» для приоритета последнего ввода.
Можно ли объединить больше 2 JSON за раз?
Можно. По умолчанию доступно 2 поля ввода, нажатие кнопки «+» динамически добавляет новые поля; все вводимые данные объединяются последовательно сверху вниз. Теоретически количество не ограничено, но память браузера ограничивает размер отдельного фрагмента.
Как определяется порядок ключей после слияния?
Глубокое слияние: приоритет имеет порядок ключей первого JSON, новые ключи из второго JSON добавляются в конец соответствующего уровня. Поверхностное слияние: по порядку ввода — сначала все ключи первого JSON, новые ключи последующих JSON добавляются на верхнем уровне; одноимённые ключи сохраняют порядок первого.
Изменяет ли инструмент типы полей?
Типы не изменяются автоматически. Если при стратегии поверхностного слияния/замены массивов у одноимённых ключей в двух JSON разные типы (один — объект, другой — массив), применяется правило «последний ввод имеет приоритет» с прямой перезаписью, преобразование типов не производится. Глубокое слияние рекурсивно обрабатывает только случай «обе стороны — обычные объекты», во всех остальных случаях применяется перезапись.
Сохраняются ли значения null?
Да. null является допустимым значением в JSON, инструмент обрабатывает null как обычное листовое значение: при поверхностном слиянии/замене массивов null из последующего ввода перезаписывает предыдущее значение; при глубоком слиянии null обрабатывается по правилам перезаписи, не пропускается специальным образом.
Выводится ли статистика после слияния?
Да. В области результатов отображается количество объединяемых фрагментов JSON и общее количество ключей для быстрой проверки результата; подробный список полей смотрите непосредственно в отформатированном выводе справа.
Отправляет ли инструмент мой JSON на сервер?
Нет. Парсинг, слияние и форматирование полностью выполняются локально в браузере, вводимые и промежуточные данные не отправляются ни на какие серверы. Можно использовать офлайн, подходит для обработки многоисточникового JSON с чувствительной информацией (например производственные конфиги, внутренние ответы API).
Какой оптимальный порядок использования вместе с форматированием JSON и валидацией Schema?
Рекомендуемая цепочка: ① Исправление JSON (очистка невалидного JSON) → ② данный инструмент JSON Merge (многоисточниковое слияние) → ③ Форматирование JSON (единообразные отступы) → ④ Валидация JSON Schema (проверка итоговой структуры) → ⑤ Последующая генерация кода (TypeScript / Java / Go и др.). Выбирайте нужные шаги по ситуации.
Устранение неполадок
При слиянии выдаётся «Unexpected token» или «Invalid JSON»
Причина: как минимум в одном поле ввода находится невалидный JSON. Решение: сначала вставьте ошибочный JSON в инструмент «Исправление JSON» для очистки (автоматическая обработка конечных запятых, одинарных кавычек, ключей без кавычек и т.д.), затем вернитесь в данный инструмент для слияния; или проверьте, не пропущены ли внешние фигурные/квадратные скобки.
После слияния некоторые поля отсутствуют
Причина: при стратегии поверхностного слияния/замены массивов одноимённые ключи полностью перезаписываются последующим вводом; при глубоком слиянии поля со значением null также перезаписывают предыдущие объекты. Решение: переключите стратегию на «Глубокое слияние» и просмотрите по уровням; если подтверждается, что null из последующего ввода вызвал перезапись, удалите null-поля из последующего JSON или замените их на значения-заполнители.
Массивы перезаписались вместо конкатенации
Причина: текущая стратегия — «Поверхностное слияние» или «Замена массивов». Решение: переключите выпадающий список на панели инструментов на «Конкатенация массивов (Array Concat)»; или вручную объедините два массива в один перед слиянием.
В результате глубокого слияния объект стал массивом или наоборот
Причина: в двух JSON по одному и тому же пути типы не совпадают («объект против массива»), при несовпадении типов глубокое слияние применяет правило «последний ввод имеет приоритет». Решение: унифицируйте типы с обеих сторон (преобразуйте в объект или в массив), или переключитесь на стратегию поверхностного слияния/замены массивов для ясной семантики.
Порядок ключей после слияния нарушился
Причина: новые ключи из второго JSON добавляются в позицию «после первого JSON» в порядке вставки, браузеры/парсеры автоматически сортируют числовые ключи по возрастанию. Решение: сначала используйте инструмент «Сортировка JSON» для унификации порядка ключей всех входных JSON, затем выполняйте слияние; или отсортируйте ещё раз перед использованием результата.
При слиянии больших файлов (10 МБ+) происходит зависание
Причина: одновременный JSON.parse нескольких больших текстов в браузере потребляет много памяти. Решение: контролируйте размер каждого ввода в пределах 1–2 МБ; для сверхбольших файлов используйте локальные скрипты на Node.js (lodash.merge) или Python (mergedeep); после обработки используйте данный инструмент для небольшой проверки.
Глоссарий
- JSON Merge
- Операция объединения двух или более JSON-объектов по заданным правилам в один новый объект; основная сложность — «стратегия разрешения конфликтов имён ключей».
- Deep Merge / Глубокое слияние
- Стратегия с рекурсивным обходом вложенных объектов и слиянием по каждому листовому узлу; если обе стороны — обычные объекты, выполняется рекурсия, иначе — перезапись.
- Shallow Merge / Поверхностное слияние
- Стратегия, при которой сливаются только ключи верхнего уровня, одноимённые ключи перезаписываются целиком; в JS эквивалентна `Object.assign({}, a, b)`.
- Array Concat / Конкатенация массивов
- Одна из стратегий работы с массивами: несколько массивов объединяются в один длинный с сохранением порядка всех элементов; часто используется для агрегации ответов API.
- Array Replace / Замена массивов
- Одна из стратегий работы с массивами: одноимённые массивы полностью заменяются последним введённым значением; часто используется для перекрытия конфигов.
- Object.assign
- Встроенный метод JavaScript, копирующий все перечисляемые собственные свойства из одного или нескольких исходных объектов в целевой объект; де-факто стандартная реализация поверхностного слияния.
- lodash.merge
- Функция глубокого слияния из библиотеки Lodash, наиболее часто используемая реализация deep merge в экосистеме Node.js; массивы объединяются, а не перезаписываются.
- mergedeep (Python)
- Библиотека глубокого слияния для экосистемы Python, устанавливается через pip install mergedeep; поддерживает параметр strategy для управления поведением объединения/замены массивов.
- jq -s 'add'
- Команда jq, складывающая несколько JSON-массивов в один; для объединения JSON-объектов используется `reduce .[] as $item ({}; . * $item)`.
- BFF (Backend for Frontend)
- Агрегационный слой между фронтендом и бэкенд-сервисами в микросервисной архитектуре; часто требует объединения JSON-ответов от нескольких сервисов в единый ответ — классический сценарий JSON Merge.
Сравнение 4 стратегий объединения JSON
| Стратегия | Область действия | Обработка массивов | Типичный сценарий |
|---|---|---|---|
| Глубокое слияние (Deep) | Рекурсивно все вложенные уровни | Согласно выбранному arrayConcat/arrayReplace | Наслоение конфигов окружений, слияние i18n-словарей |
| Поверхностное слияние (Shallow) | Только верхний уровень | Полная перезапись | Простое перекрытие в стиле Object.assign |
| Конкатенация массивов (Array Concat) | Верхний уровень | Объединение в новый массив | Агрегация пагинированных API, слияние mock-данных |
| Замена массивов (Array Replace) | Верхний уровень | Последний ввод имеет приоритет | Перекрытие конфигов Feature Flag |
Таблица сравнения распространённых реализаций JSON Merge
| Реализация/библиотека | Язык | Поведение по умолчанию | Примечание |
|---|---|---|---|
| Object.assign | JavaScript | Поверхностное слияние | Стандартная библиотека ES2015; после ES2017 используйте `Object.assign({}, a, b)` |
| { ...a, ...b } | JavaScript | Поверхностное слияние | Оператор spread, более лаконичный синтаксис |
| lodash.merge | JavaScript | Глубокое слияние | Массивы объединяются, не перезаписываются, npm install lodash.merge |
| mergedeep | Python | Глубокое слияние | strategy='override' меняет объединение массивов на замену |
| deepmerge (Python) | Python | Глубокое слияние | Другая популярная реализация, pip install deepmerge |
| jq -s 'add' | Shell | Сложение массивов | Для объединения объектов используйте `reduce .[] as $i ({}; . * $i)` |
Authoritative References
- JSON Compress
- CSV в JSON
- JSON в CSV
- JSON Diff
- JSON Escape / Unescape
- Сглаживание JSON
- Форматтер JSON
- Генератор JSON
- JSONPath Запрос
- Объединение JSON
- Восстановление JSON
- Валидатор JSON Schema
- Сортировка JSON
- JSON Stringify
- JSON в HTML
- JSON в Java
- JSON в Markdown
- JSON в SQL
- JSON в TOML
- JSON в TypeScript
- XML в JSON
- Преобразовать JSON в XML
- YAML в JSON
- JSON → YAML Конвертер
- JSON в Go
- JSON в Rust
- JSON в Swift
- JSON в C#
- JSON в C++
- JSON в PHP
- JSON в Python