9007199254740993이 다른 ID로 바뀌는 이유

아래 JSON을 JSON.parse로 읽고 JSON.stringify로 다시 쓰면 id의 마지막 숫자가 바뀝니다. 1.00은 1, 1e3은 1000으로 출력됩니다. 뒤의 두 변화는 수치가 같은 다른 표기이지만, ID 변화는 정수 값을 잃은 경우입니다.

const source = '{"id":9007199254740993,"price":1.00,"scale":1e3}';
JSON.stringify(JSON.parse(source));
// {"id":9007199254740992,"price":1,"scale":1000}

JavaScript Number의 최대 안전 정수는 9007199254740991입니다. 이를 넘는 모든 정수가 반올림되는 것은 아니지만, 서로 다른 정수가 같은 Number 값이 될 수 있습니다. JSON 문법 자체의 숫자 제한과 특정 파서의 정밀도 제한은 구분해야 합니다.

ECMAScript: Number.MAX_SAFE_INTEGER

RFC 8259 §6: JSON numbers

가상 ID 9007199254740993이 JSON.parse와 JSON.stringify 후 9007199254740992가 되고 Moyoutil에서는 원문이 보존되는 비교
동일한 가상 입력을 코드로 실행한 결과를 직접 제작한 도식입니다. 마지막 자릿수를 비교하세요. 실제 사용자 ID는 사용하지 않았습니다.

중복 키는 문법 통과와 호환성이 다릅니다

같은 객체에 mode를 두 번 쓰면 기본 JSON.parse는 앞선 값을 뒤의 값으로 덮어씁니다. RFC 8259는 객체 이름이 고유해야 한다고 권고하며, 중복 이름을 받는 프로그램들의 동작이 다를 수 있음을 설명합니다. 모든 파서가 같은 방식으로 처리한다고 가정하지 마세요.

JSON.stringify(JSON.parse('{"mode":"first","mode":"last"}'));
// {"mode":"last"}

RFC 8259 §4: JSON objects

ECMAScript: ParseJSON

Moyoutil은 중복 키를 자동 삭제하지 않습니다. 보존은 중복 키를 권장한다는 뜻이 아닙니다. 수신 시스템과 데이터 계약을 확인하고 원본 생성 단계에서 중복 이름을 해결하세요.

Moyoutil에서 원문 표기를 유지하며 검증하기

현재 formatJSON 함수는 JSON.parse로 문법을 검사하지만, 출력은 파싱된 객체가 아닌 원문 토큰에서 만듭니다. 그래서 큰 정수, 소수·지수 표기, 중복 키와 키 순서를 유지합니다. 출력은 원문과 바이트 단위로 같지 않을 수 있습니다. 공백과 줄바꿈이 바뀌며 압축도 문자열 안의 공백을 없애는 작업은 아닙니다.

formatJSON('{"id":9007199254740993,"price":1.00,"scale":1e3}', 0).output
// {"id":9007199254740993,"price":1.00,"scale":1e3}

원본을 보관하고 JSON 도구에 붙여 넣은 뒤 정리 또는 압축을 실행하세요. 중요한 ID와 수치 표기를 결과에서 비교하고 다운로드합니다. 입력을 수정하면 이전 결과와 복사 기능이 초기화되므로 다시 검증해야 합니다. 현재 입력 제한은 UTF-8 기준 2MiB이며 중첩 깊이는 128단계 이하입니다.

문법 검증은 업무 규칙, JSON Schema 또는 수신 서버의 데이터 해석을 검증하지 않습니다. JSON 숫자를 문자열로 바꾸면 자료형도 바뀌므로 자동 해결책으로 취급하지 마세요. 문자열 ID를 허용하는 데이터 계약인지 먼저 확인합니다. 서버로 보낼 실제 비밀 키나 개인정보 대신 가상 데이터를 사용해 문제를 재현하세요.

자주 묻는 질문

검증 완료라면 다른 서버에서도 숫자가 보존되나요?

아닙니다. 이 도구의 출력 표기는 보존되지만 수신 서버가 다시 숫자로 파싱하면 해당 파서의 정밀도 제한이 적용됩니다.

JSON 압축은 ZIP 압축인가요?

아닙니다. 이 기능은 JSON 문법에서 불필요한 공백과 줄바꿈을 줄인 텍스트를 만듭니다. ZIP 파일을 만들지는 않습니다.