JSON은 당신을 속이고 있다

1 week ago 16

JSON.parse(JSON.stringify(value))는 JavaScript 상태를 그대로 복제하지 않으며, 큰 정수·undefined·Date·NaN 등이 조용히 변경되거나 삭제될 수 있음 JSON은 문자열·숫자·불리언·null·배열·객체만 지원하는 작은 교환 형식이라 BigInt, 컬렉션, 프로토타입, 객체 동일성 같은 JavaScript 타입 정보를 보존하지 않음 JSON.stringify는 toJSON(), getter, replacer를 실행할 수 있고 순환 참조에서는 예외를 던지므로, 단순한 값 복사가 아니라 코드를 실행하는 변환 과정임 안전한 경계를 만들려면 큰 정수를 문자열로 인코딩하고 타입 태그와 배열·정규화 형식을 사용하며, 파싱 전 크기 제한과 파싱 후 런타임 스키마 검증을 적용해야 함 JSON은 고장 난 형식이 아니라 JavaScript의 무손실 스냅샷이 아닐 뿐이며, 송수신자가 공유하는 명시적 와이어 계약과 전체 왕복 테스트가 있어야 예측 가능하게 사용할 수 있음 JSON의 작은 데이터 모델 JSON은 2001년경 브라우저와 서버 사이에서 구조화 데이터를 가볍게 교환하는 방식으로 등장했으며, Douglas Crockford가 이름을 붙이고 대중화함 RFC 4627이 2006년 공식 규격을 정의함 현재 표준인 RFC 8259은 2017년 발행됨 당시 지배적이던 XML보다 문법이 작고 JavaScript 객체·배열 리터럴과 비슷해 초기 대화형 웹 애플리케이션에 적합했음 JSON은 문자열·숫자·불리언·null·배열·객체만 지원하며, 특정 언어의 전체 타입 시스템보다 이식성 높은 와이어 형식을 우선함 JavaScript의 undefined, BigInt, symbol, 특수 숫자, 프로토타입 객체, 내장 컬렉션은 이 모델 밖에 있음 JSON.stringify는 표현할 수 없는 값을 변경·삭제하거나 거부함 JSON.parse는 원래 타입을 복원할 정보가 부족함 캐시·데이터베이스 저장, 다른 서비스로의 전송, 다른 언어에서의 처리처럼 값이 생성 프로세스를 벗어나면 유효한 JSON인데도 의미가 달라질 수 있음 JSON이 보기 전부터 틀릴 수 있는 숫자 9007199254740993이 9007199254740992로 출력되는 정밀도 손실은 직렬화 시점이 아니라 JavaScript가 숫자 리터럴을 평가할 때 이미 발생함 JavaScript Number는 IEEE 754 binary64를 사용하며, ...

Read Entire Article