🔍 JSON Diff (구조 비교)
두 JSON을 구조적으로 비교하여 추가/삭제/변경을 JSON Pointer 경로와 함께 표시. 키 정렬, 배열 순서 무시, 타입 변화 감지 지원.
🔒 개인정보 보호
- ・모든 처리는 브라우저 내에서 완료됩니다
- ・입력 데이터는 서버로 전송되지 않습니다
차분 결과
🔗 관련 도구
📖 자주 걸리는 지점
2 개의 JSON 을 구조로서 비교하고 추가 · 삭제 · 변경을 JSON Pointer 와 함께 표시합니다. 처리는 브라우저 안에서 끝납니다. 텍스트 diff 와는 보고 있는 것이 달라 들여쓰기나 줄바꿈의 차이는 차분이 되지 않습니다. 반대로 텍스트로서는 한 글자도 다르지 않은데 구조로서는 차이가 나는, 혹은 그 반대도 일어납니다 — 이 경계를 이해해 두지 않으면 결과를 잘못 읽습니다.
| 사례 | 무슨 일이 일어나는가 | 어떻게 하면 되는가 |
|---|---|---|
| 배열 맨 앞에 한 건 더했을 뿐인데 전 요소가 변경 이 된다 | 배열은 인덱스의 위치끼리 맞춥니다. 맨 앞에 한 건 삽입하면 이후의 요소가 모두 하나씩 어긋나므로 /0 이 변경, /1 이 변경, … 끝에 한 건 추가 라는 읽기 힘든 차분이 됩니다. 텍스트 diff 가 삽입된 한 줄 이라고 표시할 수 있는 것은 최장 공통 부분 수열(LCS)을 계산하고 있기 때문이며 구조 비교는 그것을 하지 않습니다. 요소가 수십 건 있으면 차분이 전면 빨강이 되어 실질적으로 읽을 수 없게 됩니다. | 배열 순서: 무시로 바꾸세요 — 집합으로 비교하므로 재정렬만 한 것은 변경 없음 이 됩니다. 다만 이는 순서에 의미가 있는 배열(절차 · 우선도 · 랭킹)에는 쓸 수 없습니다. 실무에서 가장 잘 듣는 것은 비교 전에 id 로 정렬을 맞춰 두는 것입니다 — API 의 응답은 순서가 보장되지 않는 경우가 많고 순서의 흔들림을 차분으로 보여 줘도 판단 재료가 되지 않습니다. 차분을 읽는 기준으로, 변경이 전 건에 미쳤다면 정말로 전부 바뀌었다가 아니라 대응 짓기에 실패하고 있다를 먼저 의심하세요. |
| 겉보기에 같은 숫자인데 변경 이라고 나온다 · 다른데 안 나온다 | JSON 에는 정수와 부동소수점의 구별이 없습니다. 1 과 1.0 은 파스 후에 같은 값이 되므로 차분은 나오지 않지만 문자열 "1" 과 숫자 1 은 타입 변화: 엄격 에서는 별개입니다. API 의 응답에서 숫자가 문자열이 되었다 돌아왔다 하는 흔들림은 드물지 않습니다(큰 정수를 안전하게 나르기 위해 문자열로 하는 설계는 일반적입니다). 더 위험한 것은 반대의 경우입니다 — JavaScript 의 Number 는 2 의 53 제곱을 넘는 정수를 정확히 나타낼 수 없으므로 9007199254740993 과 9007199254740992 는 파스한 시점에 같은 값이 되어 차분이 전혀 나오지 않습니다. |
타입의 흔들림만 허용하고 싶다면 타입 변화: 느슨함으로 바꾸세요. 다만 큰 정수의 문제는 이 도구에 한하지 않고 JavaScript 를 거치는 모든 비교에서 일어납니다 — 대상이 Snowflake ID · 스냅숏의 버전 번호 · 금액을 최소 단위의 정수로 갖는 데이터 등이라면 비교 전에 그 항목을 문자열로 다룰(파서에 reviver 를 넘기거나 비교 대상에서 빼고 따로 검사할) 필요가 있습니다. 판별은 간단해서 값이 16 자리를 넘으면 의심하세요 — 2 의 53 제곱은 9,007,199,254,740,992 로 16 자리입니다. |
| null 과 키가 없는 것의 구별에 휘둘린다 | {"a": null} 과 {} 는 구조로서 별개이므로 차분이 나옵니다. 이는 올바른 동작이지만 실제 시스템에서는 양쪽을 구별하지 않는 경우가 많아 의미 없는 차분이 대량으로 나옵니다. 원인은 언어 쪽에 있습니다 — JavaScript 의 JSON.stringify 는 값이 undefined 인 키를 출력에서 떨어뜨리지만 Python 의 json.dumps 는 None 을 null 로 출력합니다. 같은 값이 없음 을 나타내는데 한쪽은 키째 사라지고 다른 쪽은 null 이 남습니다. 언어를 넘나드는 API 의 비교에서는 거의 확실히 여기서 차분이 부풉니다. |
비교 전에 어느 한쪽으로 정규화하세요 — 실무에서는 값이 null 인 키를 양쪽에서 제거하는 것이 다루기 쉽습니다(누락과 null 을 동일시하게 되므로 그 전제가 성립하는 데이터에서만). 다만 이 둘을 의도적으로 구별하는 API 에서는 절대 정규화하지 마세요 — PATCH 의 의미론에서는 {"a": null} 이 a 를 지워라, 키가 없는 것이 a 에는 손대지 마라 를 나타냅니다(JSON Merge Patch, RFC 7386). 여기를 뭉개면 차분에서 생성한 갱신 요청이 의도하지 않은 필드를 삭제합니다. 정규화해도 되는지는 항상 상대 API 의 사양으로 정해집니다. |
JSON Pointer(RFC 6901)에는 이스케이프 규칙이 있습니다 — 키에 포함된 ~ 는 ~0, / 는 ~1 이라고 씁니다. URL 이나 파일 경로를 키로 삼은 사전에서는 반드시 이에 해당합니다 — {"https://example.com/a": 1} 의 키를 가리키는 Pointer 는 /https:~1~1example.com~1a 입니다. 표시된 Pointer 를 그대로 코드에 붙이면 이스케이프를 되돌리는 것을 잊어 다른 경로를 가리켜 버리므로 주의하세요. 순서에 관한 또 한 가지: JSON 오브젝트의 키 순서는 사양상 의미를 갖지 않지만 많은 파서는 삽입 순서를 유지합니다. 따라서 키 순서의 차분은 의미는 같지만 생성 쪽이 바뀌었다는 정보가 되어 라이브러리의 갱신이나 시리얼라이저의 교체를 검출하는 실마리가 됩니다 — 노이즈로 무시하기 전에 왜 바뀌었는지를 한 번 확인할 가치가 있습니다.
📖 사용법
-
1
두 JSON 붙여넣기왼쪽에 이전 버전, 오른쪽에 새 버전을 붙여넣으세요. 샘플 버튼으로 바로 시도할 수 있습니다.
-
2
옵션 조정표시 모드(트리/플랫/유니파이드), 키/배열 순서 무시 여부, 타입 비교의 엄격성을 선택하세요.
-
3
차분 확인추가 (+)・삭제 (-)・변경 (~)이 JSON Pointer와 함께 색으로 표시됩니다. 요약으로 건수를 한눈에 확인하세요.
❓ 자주 묻는 질문
JSON Pointer란 무엇인가요?
배열 순서를 무시하면 무엇이 달라지나요?
문자열 "1"과 숫자 1은 어떻게 비교되나요?
🐛 이 도구에서 문제가 발생했나요?
무료 · 가입 불필요. 재현 절차만이라도 도움이 됩니다. 보고는 운영자에게 직접 전달되어 개선에 사용됩니다.
보고 감사합니다!
운영자에게 전달되었습니다. 개선에 사용됩니다.