JSON 병합
무료 온라인 JSON 병합 도구. 여러 JSON 객체를 지정된 전략(Deep Merge/Shallow Merge/Array Concat/Array Replace)에 따라 한 번에 하나로 합칩니다. 4가지 충돌 해결 모드를 제공하며 다중 소스 데이터 집계, 설정 계층화, i18n 병합 등의 시나리오에 적합합니다.
관련 추천
JSON 병합(JSON Merge)이란 무엇인가요?
JSON 병합(JSON Merge)은 두 개 이상의 JSON 객체를 일정한 규칙에 따라 하나의 새 객체로 합치는 작업입니다. 개발에서 매우 자주 사용됩니다: ① 여러 마이크로서비스가 반환한 JSON을 하나의 통합 응답으로 조합(BFF 계층 집계); ② base 설정, env 설정, 사용자 설정을 '환경별 오버라이드' 로직으로 합쳐 최종 설정 생성(Node.js config, Viper, Spring Cloud Config); ③ 여러 i18n 번역 파일을 병합·오버라이드·보완하여 완전한 사전으로 완성; ④ 여러 mock 데이터 배열을 합쳐 완전한 테스트 데이터로 구성; ⑤ 여러 API 페이지네이션 응답을 합쳐 전체 결과로 통합.
병합의 어려움은 '합치는 것' 자체가 아니라 '충돌을 어떻게 처리할 것인가'에 있습니다. 흔한 충돌 해결 전략은 4가지입니다: ① **Deep Merge(딥머지/깊은 병합)**: 중첩 객체 안으로 재귀적으로 들어가 각 키를 개별적으로 병합하며, 리프 노드에서만 충돌 시 덮어씁니다. 설정 계층화에 적합; ② **Shallow Merge(얕은 병합)**: 최상위 키만 병합하고 동명 키는 전체를 덮어씁니다. 의미가 가장 단순하며 `Object.assign`과 유사; ③ **Array Concat(배열 이어붙이기)**: 배열 타입의 값을 하나의 긴 배열로 이어붙여 모든 요소의 순서를 보존합니다. API 집계에 적합; ④ **Array Replace(배열 덮어쓰기)**: 배열 타입의 값을 나중에 입력한 것으로 통째로 덮어씁니다. 설정 오버라이드에 적합.
구현 측면에서 Deep Merge는 보통 스택 기반 재귀를 사용합니다: 양쪽 모두 일반 객체(배열이나 null이 아님)인지 먼저 확인한 다음 각 키에 대해 재귀적으로 처리합니다. 타입이 일치하지 않는 경우(예: 동명 키가 한쪽은 객체고 다른 쪽은 배열), 일반적으로 '나중에 입력한 값을 우선'으로 처리하며 타입 변환은 하지 않습니다. GeekFormat의 JSON 병합 도구는 위 4가지 전략을 내장하고 있어 페이지에서 바로 전환할 수 있습니다. 2개부터 N개까지의 JSON을 한 번에 붙여넣으면 순서대로 자동 병합되어 통합된 포맷 결과를 출력합니다. 전체 병합 과정은 브라우저 로컬에서 완료되며 원본 데이터는 업로드되지 않습니다.
사용 사례
- 여러 마이크로서비스 API 응답을 하나의 통합 JSON 구조로 병합하여 프론트엔드에서 사용
- base/dev/prod 다층 설정 파일을 집계하여 환경별 오버라이드로 최종 설정 생성
- 여러 i18n 번역 파일을 언어별로 병합·중복 제거·보완하여 완전한 사전으로 완성
- 여러 mock 데이터 배열이나 페이지네이션 API 응답을 합쳐 완전한 데이터 세트로 구성
- 프론트엔드 컴포넌트에서 기본 설정 + 사용자 커스텀 설정 + 원격 A/B 실험 설정 병합
- 데이터 마이그레이션에서 여러 소스 시스템의 JSON 내보내기 파일을 합쳐 다운스트림 형식으로 통일
이용 방법
- 병합할 2~N개의 JSON을 왼쪽 입력창에 순서대로 붙여넣거나(기본 2개) 「+」를 클릭하여 입력창을 더 추가
- 툴바 드롭다운에서 병합 전략을 선택: Deep Merge(깊은 병합) / Shallow Merge(얕은 병합) / Array Concat(배열 이어붙이기) / Array Replace(배열 덮어쓰기)
- 「병합」 버튼을 클릭하면 오른쪽 출력창에 병합된 포맷 결과가 표시됩니다; 입력에 구문 오류가 있으면 구체적인 행 번호와 오류 메시지가 표시됨
- 결과가 정확한지 확인한 후 「복사」를 클릭하여 병합 결과를 클립보드에 넣거나 「다운로드」를 클릭하여 merged.json 파일로 저장한 후 포맷팅, Schema 검증 등 후속 처리 진행
주요 기능
- 4가지 병합 전략: Deep Merge / Shallow Merge / Array Concat / Array Replace, 원클릭 전환으로 다양한 비즈니스 시나리오 대응
- 2~N개 JSON 지원: 기본 2개 입력창에 「+」 버튼으로 입력창을 동적 추가 가능, 다중 소스 집계에 유연하게 대응
- 재귀적 깊은 병합: 다층 중첩 객체를 지능적으로 처리하고 리프 노드 충돌을 지정 전략으로 해결하여 모든 유효 필드를 보존
- 유연한 충돌 해결: 최상위 충돌은 선택 전략으로 처리; 중첩 객체 충돌은 깊이 들어가 병합; 배열 충돌은 arrayConcat/arrayReplace로 구분 처리
- 통합 포맷 출력: 병합 결과를 2칸 공백 들여쓰기로 표시하여 수동 검토와 다운스트림 도구로의 직접 복사에 편리
- 실시간 병합 실행: 붙여넣기 후 「병합」 클릭 시 즉시 결과 표시, 오류 발생 시 JSON 행 번호와 오류 메시지를 구체적으로 출력
- 로컬 처리로 프라이버시 보호: 파싱, 병합, 포맷팅이 모두 브라우저 로컬에서 완료되며 입력 내용이 어떤 서버로도 전송되지 않음
- 다운스트림과 매끄럽게 연계: 병합 결과를 원클릭으로 JSON 포맷터, Schema 검증, 코드 생성 등의 도구로 복사하여 후속 처리 가능
코드 예제
lodash merge를 사용한 JavaScript 깊은 병합
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'] }mergedeep를 사용한 Python 깊은 병합
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'를 추가하세요jq -s를 사용한 명령줄에서의 다중 JSON 병합
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 병합을 말합니다.
Deep Merge와 Shallow Merge는 어떻게 선택하나요?
Shallow Merge(얕은 병합)는 최상위 키만 처리하고 동명 키를 전체 교체합니다. `Object.assign`과 유사하며 가장 단순하고 직관적입니다. Deep Merge(깊은 병합)는 중첩 객체 안으로 재귀적으로 들어가 각 리프 노드를 개별적으로 병합하므로 더 스마트합니다. 여러 JSON이 서로 다른 하위 경로에 필드를 추가하는 경우(예: base.user.name과 override.user.email)는 Deep Merge를 사용하고, 하위 객체 전체를 한 번에 교체하려면 Shallow Merge를 사용하세요.
배열 병합 시 순서 기준인가요, 인덱스 기준인가요?
본 도구는 기본적으로 '이어붙이기' 의미를 따릅니다: 여러 배열을 하나의 긴 배열로 이어붙여 모든 요소의 순서를 보존합니다. 두 배열의 길이가 같고 인덱스별로 덮어쓰고 싶다면 'arrayReplace'로 전환한 후 배열을 객체 구조로 한 겹 감싸서 수동으로 처리하세요.
키 이름 충돌 시 누가 누구를 덮어쓰나요?
입력 순서로 결정됩니다: 나중에 입력한 JSON이 앞선 JSON의 동명 키를 덮어씁니다(Shallow/Array Replace 전략에서는 전체 덮어쓰기, Deep Merge에서는 리프 노드만 덮어쓰기). '먼저 입력한 것을 우선'하고 싶다면 입력 순서를 바꿔서 넣으면 됩니다.
JSON 배열 병합도 지원하나요?
지원합니다. 대표적인 두 가지 시나리오: ① 여러 JSON이 모두 배열인 경우 → 'arrayConcat'으로 하나의 긴 배열로 이어붙이기; ② 여러 JSON이 모두 객체이고 특정 필드가 배열인 경우 → 'arrayConcat'으로 여러 배열을 이어붙이거나 'arrayReplace'로 나중 입력값으로 덮어쓰기.
한 번에 2개 넘는 JSON을 병합할 수 있나요?
가능합니다. 기본으로 2개 입력창이 제공되며 「+」 버튼으로 입력창을 동적으로 더 추가할 수 있습니다. 모든 입력은 위에서 아래 순서로 순차 병합됩니다. 이론상 개수 제한은 없지만 브라우저 메모리가 단일 크기를 제한합니다.
병합 후 키 순서는 어떻게 결정되나요?
Deep Merge: 첫 번째 JSON의 키 순서가 우선이며, 두 번째 JSON의 새 키는 해당 레벨의 끝에 추가됩니다. Shallow Merge: 입력 순서대로 첫 번째 JSON의 모든 키가 먼저 나오고 이후 JSON의 새 키가 최상위에 추가됩니다; 동명 키는 첫 번째 순서를 유지합니다.
도구가 필드 타입을 임의로 변경하나요?
능동적으로 타입을 변경하지 않습니다. Shallow/Array Replace 전략에서 두 JSON의 동명 키가 한쪽은 객체고 다른 쪽은 배열이면 타입이 달라도 '나중 입력 우선'으로 그대로 덮어쓰며 타입 변환은 하지 않습니다. Deep Merge는 '양쪽 모두 일반 객체'인 경우에만 재귀하며 그 외에는 모두 덮어쓰기로 처리합니다.
null 값도 보존되나요?
네. null은 JSON에서 유효한 값이므로 본 도구는 null을 일반 리프 값으로 처리합니다: Shallow/Array Replace에서는 나중 입력의 null이 이전 값을 덮어쓰고; Deep Merge에서도 null을 만나면 덮어쓰기 규칙에 따라 처리하며 특별히 건너뛰지 않습니다.
병합 후 통계 정보를 출력하나요?
네. 결과 영역에 병합에 참여한 JSON 개수와 총 키 수를 표시하여 결과를 빠르게 검증할 수 있습니다. 상세 필드 목록은 우측 포맷된 출력을 직접 확인하세요.
도구가 내 JSON을 서버에 업로드하나요?
아니요. 파싱, 병합, 포맷팅이 모두 브라우저 로컬에서 완료되며 입력과 중간 결과가 어떤 서버로도 전송되지 않습니다. 오프라인에서도 사용할 수 있어 민감 정보(프로덕션 환경 설정, 내부 API 응답 등)가 포함된 다중 소스 JSON 처리에 적합합니다.
JSON 포맷터, Schema 검증과 함께 사용할 때 최적의 순서는?
추천 워크플로: ① JSON 수리(비정상 JSON 정제) → ② 본 도구 JSON 병합(다중 소스 병합) → ③ JSON 포맷팅(들여쓰기 통일) → ④ JSON Schema 검증(최종 구조 검증) → ⑤ 후속 코드 생성(TypeScript/Java/Go 등). 필요한 단계만 선택해서 사용하세요.
문제 해결
병합 시 "Unexpected token" 또는 "Invalid JSON" 오류가 표시됨
원인: 적어도 하나의 입력창에 있는 JSON이 유효하지 않습니다. 해결 방법: 먼저 오류가 있는 JSON을 「JSON 수리」 도구에 붙여넣어 정제(끝 쉼표, 작은따옴표, 따옴표 없는 키 등을 자동 처리)한 후 본 도구로 돌아와 병합하세요; 또는 외부 중괄호/대괄호 누락 여부를 확인하세요.
병합 후 일부 필드가 나타나지 않음
원인: Shallow/Array Replace 전략에서 동명 키가 나중 입력값에 의해 통째로 덮어쓰기되었습니다; Deep Merge에서도 null 값 필드가 앞선 객체를 덮어쓸 수 있습니다. 해결 방법: 전략을 'Deep Merge(깊은 병합)'로 전환하여 레이어별로 확인하세요; 나중 입력의 null이 덮어쓰는 것이 확실하다면 나중 입력 JSON에서 null 필드를 삭제하거나 플레이스홀더 값으로 교체하세요.
배열이 이어붙여지지 않고 덮어써짐
원인: 현재 전략이 'Shallow Merge' 또는 'Array Replace'입니다. 해결 방법: 툴바 드롭다운에서 'Array Concat(배열 이어붙이기)'로 전환하세요; 또는 두 배열을 수동으로 하나로 합친 후 병합하세요.
Deep Merge 결과에서 객체가 배열이 되거나 그 반대가 됨
원인: 두 JSON의 동일 경로에서 '객체 vs 배열' 타입이 일치하지 않습니다. Deep Merge는 타입 불일치 시 '나중 입력 우선'으로 처리합니다. 해결 방법: 양쪽 타입을 통일(모두 객체 또는 모두 배열)하거나 Shallow/Array Replace 전략으로 전환하여 의미를 명확히 하세요.
병합 후 키 순서가 뒤섞임
원인: 두 번째 JSON의 새 키는 '삽입 위치'에 따라 첫 번째 JSON 뒤에 추가되며, 브라우저/파서는 순수 정수 키를 자동으로 숫자 순서 정렬합니다. 해결 방법: 모든 입력 JSON을 먼저 「JSON 정렬」 도구로 키 이름 순서를 통일한 후 병합하세요; 또는 결과 사용 전에 다시 한번 정렬하세요.
대용량 파일(10MB+) 병합 시 브라우저가 멈춤
원인: 브라우저가 여러 단락의 대용량 텍스트를 한 번에 JSON.parse할 때 메모리를 많이 소비합니다. 해결 방법: 각 입력을 1~2MB 이내로 제어하세요; 초대용량 파일은 로컬에서 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 라이브러리가 제공하는 깊은 병합 함수로, Node.js 생태계에서 가장 널리 쓰이는 deep merge 구현체입니다. 배열은 덮어쓰지 않고 이어붙입니다.
- mergedeep (Python)
- Python 생태계의 깊은 병합 라이브러리. pip install mergedeep로 설치하며 strategy 매개변수로 배열 이어붙이기/덮어쓰기 동작을 제어할 수 있습니다.
- jq -s 'add'
- jq 명령으로 여러 JSON 배열을 단일 배열로 합칩니다. 여러 JSON 객체를 병합하려면 `reduce .[] as $item ({}; . * $item)`를 사용합니다.
- BFF (Backend for Frontend)
- 마이크로서비스 아키텍처에서 프론트엔드와 백엔드 서비스 사이에 위치한 집계 계층. 여러 서비스의 JSON 응답을 하나의 통합 응답으로 합치는 경우가 많아 JSON 병합의 대표적인 시나리오입니다.
4가지 JSON 병합 전략 비교
| 전략 | 적용 범위 | 배열 처리 | 대표 시나리오 |
|---|---|---|---|
| Deep Merge(깊은 병합) | 모든 중첩 레벨을 재귀 | 선택한 arrayConcat/arrayReplace 따름 | 다중 환경 설정 계층화, i18n 사전 병합 |
| Shallow Merge(얕은 병합) | 최상위만 병합 | 통째로 덮어쓰기 | Object.assign 스타일의 단순 오버라이드 |
| Array Concat(배열 이어붙이기) | 최상위 | 새 배열로 이어붙이기 | 페이지네이션 API 집계, mock 데이터 병합 |
| Array Replace(배열 덮어쓰기) | 최상위 | 나중 입력값 우선 | Feature Flag 설정 오버라이드 |
주요 JSON 병합 구현 대조표
| 구현/라이브러리 | 언어 | 기본 동작 | 비고 |
|---|---|---|---|
| Object.assign | JavaScript | 얕은 병합 | ES2015 표준 라이브러리; ES2017 이후 `Object.assign({}, a, b)`로 사용 가능 |
| { ...a, ...b } | JavaScript | 얕은 병합 | 전개 연산자, 더 간결한 문법 |
| 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 압축
- CSV 를 JSON으로
- JSON을 CSV로
- JSON Diff
- JSON Escape / Unescape
- JSON 평탄화
- JSON 포맷터
- JSON 생성기
- JSONPath 온라인 쿼리
- JSON 병합
- JSON 복구
- JSON 스키마 검증기
- 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으로