콘텐츠로 건너뛰기

🔍 JSON Diff (구조 비교)

두 JSON을 구조적으로 비교하여 추가/삭제/변경을 JSON Pointer 경로와 함께 표시. 키 정렬, 배열 순서 무시, 타입 변화 감지 지원.

완전 무료 가입 불필요 브라우저 완결 5 개 언어 다크 모드

🔒 개인정보 보호

차분 결과

📖 자주 걸리는 지점

2 개의 JSON 을 구조로서 비교하고 추가 · 삭제 · 변경을 JSON Pointer 와 함께 표시합니다. 처리는 브라우저 안에서 끝납니다. 텍스트 diff 와는 보고 있는 것이 달라 들여쓰기나 줄바꿈의 차이는 차분이 되지 않습니다. 반대로 텍스트로서는 한 글자도 다르지 않은데 구조로서는 차이가 나는, 혹은 그 반대도 일어납니다 — 이 경계를 이해해 두지 않으면 결과를 잘못 읽습니다.

사례 무슨 일이 일어나는가 어떻게 하면 되는가
배열 맨 앞에 한 건 더했을 뿐인데 전 요소가 변경 이 된다 배열은 인덱스의 위치끼리 맞춥니다. 맨 앞에 한 건 삽입하면 이후의 요소가 모두 하나씩 어긋나므로 /0 이 변경, /1 이 변경, … 끝에 한 건 추가 라는 읽기 힘든 차분이 됩니다. 텍스트 diff 가 삽입된 한 줄 이라고 표시할 수 있는 것은 최장 공통 부분 수열(LCS)을 계산하고 있기 때문이며 구조 비교는 그것을 하지 않습니다. 요소가 수십 건 있으면 차분이 전면 빨강이 되어 실질적으로 읽을 수 없게 됩니다. 배열 순서: 무시로 바꾸세요 — 집합으로 비교하므로 재정렬만 한 것은 변경 없음 이 됩니다. 다만 이는 순서에 의미가 있는 배열(절차 · 우선도 · 랭킹)에는 쓸 수 없습니다. 실무에서 가장 잘 듣는 것은 비교 전에 id 로 정렬을 맞춰 두는 것입니다 — API 의 응답은 순서가 보장되지 않는 경우가 많고 순서의 흔들림을 차분으로 보여 줘도 판단 재료가 되지 않습니다. 차분을 읽는 기준으로, 변경이 전 건에 미쳤다면 정말로 전부 바뀌었다가 아니라 대응 짓기에 실패하고 있다를 먼저 의심하세요.
겉보기에 같은 숫자인데 변경 이라고 나온다 · 다른데 안 나온다 JSON 에는 정수와 부동소수점의 구별이 없습니다. 11.0 은 파스 후에 같은 값이 되므로 차분은 나오지 않지만 문자열 "1" 과 숫자 1 은 타입 변화: 엄격 에서는 별개입니다. API 의 응답에서 숫자가 문자열이 되었다 돌아왔다 하는 흔들림은 드물지 않습니다(큰 정수를 안전하게 나르기 위해 문자열로 하는 설계는 일반적입니다). 더 위험한 것은 반대의 경우입니다 — JavaScript 의 Number 는 2 의 53 제곱을 넘는 정수를 정확히 나타낼 수 없으므로 90071992547409939007199254740992 는 파스한 시점에 같은 값이 되어 차분이 전혀 나오지 않습니다. 타입의 흔들림만 허용하고 싶다면 타입 변화: 느슨함으로 바꾸세요. 다만 큰 정수의 문제는 이 도구에 한하지 않고 JavaScript 를 거치는 모든 비교에서 일어납니다 — 대상이 Snowflake ID · 스냅숏의 버전 번호 · 금액을 최소 단위의 정수로 갖는 데이터 등이라면 비교 전에 그 항목을 문자열로 다룰(파서에 reviver 를 넘기거나 비교 대상에서 빼고 따로 검사할) 필요가 있습니다. 판별은 간단해서 값이 16 자리를 넘으면 의심하세요 — 2 의 53 제곱은 9,007,199,254,740,992 로 16 자리입니다.
null 과 키가 없는 것의 구별에 휘둘린다 {"a": null}{}구조로서 별개이므로 차분이 나옵니다. 이는 올바른 동작이지만 실제 시스템에서는 양쪽을 구별하지 않는 경우가 많아 의미 없는 차분이 대량으로 나옵니다. 원인은 언어 쪽에 있습니다 — JavaScript 의 JSON.stringify 는 값이 undefined 인 키를 출력에서 떨어뜨리지만 Python 의 json.dumpsNonenull 로 출력합니다. 같은 값이 없음 을 나타내는데 한쪽은 키째 사라지고 다른 쪽은 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. 1
    두 JSON 붙여넣기
    왼쪽에 이전 버전, 오른쪽에 새 버전을 붙여넣으세요. 샘플 버튼으로 바로 시도할 수 있습니다.
  2. 2
    옵션 조정
    표시 모드(트리/플랫/유니파이드), 키/배열 순서 무시 여부, 타입 비교의 엄격성을 선택하세요.
  3. 3
    차분 확인
    추가 (+)・삭제 (-)・변경 (~)이 JSON Pointer와 함께 색으로 표시됩니다. 요약으로 건수를 한눈에 확인하세요.

❓ 자주 묻는 질문

JSON Pointer란 무엇인가요?
RFC 6901에 정의된 슬래시 구분 경로 표기법으로 JSON 내부의 임의 값을 가리킵니다. 예: /users/0/email.
배열 순서를 무시하면 무엇이 달라지나요?
배열을 집합으로 처리하여 순서가 달라도 내용이 같으면 동일로 간주합니다. 순서 무관 비교에 유용합니다.
문자열 "1"과 숫자 1은 어떻게 비교되나요?
엄격 모드에서는 변경으로, 느슨한 모드에서는 동일한 값으로 처리됩니다. API 응답의 타입 변동을 허용할 때 사용하세요.
🐛 이 도구에서 문제가 발생했나요?

무료 · 가입 불필요. 재현 절차만이라도 도움이 됩니다. 보고는 운영자에게 직접 전달되어 개선에 사용됩니다.

※ 재현을 위해 브라우저 정보 (UA / 화면 / 언어 / URL) 가 자동 전송됩니다