Объединение JSON

#1Ввод
#2Ввод

Бесплатный онлайн-инструмент для объединения 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-экспортов из нескольких исходных систем в единый формат для последующей обработки

Как использовать

  1. Вставьте от 2 до N фрагментов JSON для объединения последовательно в левые поля ввода (по умолчанию 2 поля) или нажмите «+» для добавления новых полей
  2. Выберите стратегию слияния в выпадающем списке на панели инструментов: глубокое слияние (Deep) / поверхностное слияние (Shallow) / конкатенация массивов (Array Concat) / замена массивов (Array Replace)
  3. Нажмите кнопку «Объединить», в правом поле вывода отобразится отформатированный результат; при синтаксических ошибках во вводе будут показаны конкретный номер строки и сообщение об ошибке
  4. После проверки результата нажмите «Копировать» для помещения объединённого результата в буфер обмена или «Скачать» для сохранения в файл 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.assignJavaScriptПоверхностное слияниеСтандартная библиотека ES2015; после ES2017 используйте `Object.assign({}, a, b)`
{ ...a, ...b }JavaScriptПоверхностное слияниеОператор spread, более лаконичный синтаксис
lodash.mergeJavaScriptГлубокое слияниеМассивы объединяются, не перезаписываются, npm install lodash.merge
mergedeepPythonГлубокое слияниеstrategy='override' меняет объединение массивов на замену
deepmerge (Python)PythonГлубокое слияниеДругая популярная реализация, pip install deepmerge
jq -s 'add'ShellСложение массивовДля объединения объектов используйте `reduce .[] as $i ({}; . * $i)`

Authoritative References