JSON 비교기
두 JSON 붙여넣기 → 추가·삭제·변경 키 즉시 비교
JSON 비교기란?
두 JSON을 같은 구조를 따라 함께 순회하며 키(객체) 또는 인덱스(배열) 단위로 추가된 항목(녹색), 삭제된 항목(빨간색), 변경된 값(파란색)을 찾아냅니다. 값이 둘 다 객체이거나 둘 다 배열이면 그 안으로 재귀적으로 들어가 비교하고, 배열은 인덱스 0, 1, 2...를 키처럼 취급해 각 위치의 값을 따로 비교합니다 — 즉 {"tags":["a","b","c"]}에서 가운데 "b"만 "x"로 바뀌면 배열 전체가 아니라 tags.1: b → x 한 줄만 변경으로 표시됩니다. 다만 이 방식은 인덱스 위치를 그대로 대응시키는 방식이라, 배열 중간에 새 요소를 끼워 넣으면(LCS 정렬 없이) 그 뒤의 모든 요소가 밀리면서 "변경"으로 잘못 표시될 수 있습니다. API 응답 변경 확인, 설정 파일 비교, 데이터 마이그레이션 검증 등에 유용합니다.
자주 묻는 질문
배열 비교는 정확히 어떻게 되나요?
배열은 인덱스를 객체의 키처럼 취급해 같은 인덱스의 값끼리 비교합니다. 배열 안에 객체나 중첩 배열이 있으면 그 안까지 재귀적으로 들어가 비교하므로, items: [{"id":1,"v":"x"}, {"id":2,"v":"y"}]처럼 배열 속 객체의 필드 하나만 바뀌어도 정확히 그 필드만 변경으로 표시됩니다.
배열 중간에 요소가 추가/삭제되면 어떻게 표시되나요?
인덱스 위치를 그대로 대응시켜 비교하기 때문에, 배열 맨 끝에 추가/삭제되는 경우는 정확히 추가·삭제로 표시되지만, 중간에 삽입하면 그 뒤의 모든 요소가 한 칸씩 밀리면서 실제로는 안 바뀐 값들도 "변경"으로 표시될 수 있습니다. 이는 LCS(최장 공통 부분열) 기반 정렬을 하지 않는 인덱스 비교 방식의 알려진 한계입니다.
중첩 JSON도 비교 가능한가요?
재귀적으로 중첩 객체와 배열을 함께 순회하며 비교합니다. 점(.) 표기법으로 중첩 경로를 표시합니다(예: user.address.city).
null과 undefined 차이도 표시되나요?
null은 JSON에서 유효한 값으로, null → 다른 값으로 변경되면 변경으로 표시됩니다. undefined는 JSON에 존재하지 않아 키 없음(추가/삭제)으로 처리됩니다.
타입 변경(string → number)도 감지되나요?
값이 다르면 타입 무관하게 변경으로 표시됩니다. 예: "30" → 30도 변경으로 표시됩니다. 배열과 배열 아닌 값 사이의 타입 변경도 동일하게 감지됩니다.
JSON 순서가 다르면 어떻게 되나요?
객체 키 순서는 의미가 없으므로, 순서가 달라도 값이 같으면 동일로 처리됩니다. 다만 배열은 순서 자체가 값의 일부이므로 순서가 다르면 해당 인덱스가 변경으로 표시됩니다.
대용량 JSON도 비교 가능한가요?
브라우저 내 JS로 처리하므로 수백 KB 규모는 문제 없습니다. 수 MB 이상의 대용량은 성능이 저하될 수 있습니다.
JSON 유효성 검사도 함께 하나요?
네, 비교 전에 각 JSON의 파싱 가능 여부를 먼저 검사합니다. 파싱 오류가 있으면 해당 오류를 먼저 알려줍니다.