한국어

개발자 도구 · JSON 포맷터 및 유효성 검사기

JavaScript 객체 리터럴과 JSON: 작은따옴표가 유효성 검사에 실패하는 이유

· 작동 방식

JSON 개발자 워크플로 검증

JavaScript 객체 리터럴과 JSON: JSON 토큰과 정확한 검증 경계로 설명된 작은따옴표가 검증에 실패하는 이유
원본 ToolAcre 벡터 일러스트레이션

JavaScript 콘솔에 의해 인쇄된 객체는 JSON처럼 보이지만 일반적으로 그렇지 않습니다. 이 게시물에는 정확한 차이점(인용부호, 인용되지 않은 키, 정의되지 않음, 기능)이 나열되어 있으며 각각이 유효성 검사기를 트립하는 위치를 보여줍니다.

콘솔에서 나왔는데 왜 무효인가요?

콘솔에서 나왔는데 왜 무효인가요? — 개발자 콘솔은 보장된 JSON 직렬화가 아닌 JavaScript 소스와 유사한 텍스트로 JavaScript 값을 표시합니다. 복사된 객체에는 기본 속성 이름, 작은따옴표로 묶인 문자열, `undefined` 또는 브라우저별 주석이 포함될 수 있습니다. 이 모든 것은 JavaScript 엔진이나 독자가 이해할 수 있지만 `.json` 파일에서는 즉시 실패합니다. 이 파일의 문법은 의도적으로 더 작고 실행 가능한 코드와 독립적입니다.

`{name: "Ada", active: true, missing: undefined}`을(를) 고려하세요. 중괄호, 콜론 및 부울은 JSON과 유사하지만 첫 번째 기본 키는 이미 개체 구성원 규칙을 위반하고 `undefined`는 나중에 실패합니다. ToolAcre는 지원되지 않는 첫 번째 문자나 값을 줄과 열로 보고하므로 변환은 순서대로 수행하는 것이 가장 좋습니다.

문자열에는 큰따옴표를 사용해야 합니다.

문자열은 큰따옴표를 사용해야 합니다. — JSON는 문자열을 `"`로 묶은 문자로 정의하며 필요한 경우 백슬래시 이스케이프를 사용합니다. 작은따옴표는 문자열 구분 기호 역할을 하지 않습니다. 유효성 검사기가 `'Ada'`를 충족하면 문자열을 시작한 다음 해당 내용에 반대하지 않습니다. 여는 아포스트로피 자체를 거부합니다. JavaScript가 자체 리터럴에 대해 인용 스타일을 허용하더라도 이는 속성 이름과 문자열 값에 동일하게 적용됩니다.

따옴표를 변환하려면 모든 아포스트로피를 전역적으로 바꾸는 것보다 더 많은 주의가 필요합니다. `Ada's profile`와 같은 텍스트 내부의 아포스트로피는 값이 큰따옴표로 묶여 있으면 일반 콘텐츠이지만, 해당 콘텐츠 내의 기존 큰따옴표는 이스케이프되어야 합니다. 유효한 JSON 형식은 `"Ada's "profile""`입니다.

키는 따옴표로 묶인 문자열이어야 합니다.

키는 따옴표로 묶인 문자열이어야 합니다. JavaScript 객체 리터럴은 `{name: 1}` 같은 식별자 스타일 이름과 `{[expression]: 1}` 같은 계산된 이름을 허용합니다. JSON는 단축어를 허용하지 않습니다. 여는 중괄호나 쉼표 뒤의 다음 멤버는 큰따옴표로 묶인 문자열로 시작하고 그 뒤에 콜론이 와야 합니다. 유효한 표현은 `{"name": 1}`입니다. `n`를 가리키는 유효성 검사기는 견적이 필요한 정확한 위치를 식별합니다.

모든 키를 인용하면 공백, 하이픈 및 예약어 주변의 모호함도 제거됩니다. JavaScript에서는 이러한 경우에 대해 다른 소스 구문이 필요할 수 있지만 JSON에서는 하나의 일관된 규칙을 사용합니다. `"display-name"`, `"first name"` 및 `"default"`는 모두 일반 멤버 이름입니다. 숫자처럼 보이는 키도 문자열입니다.

값 JSON에는 단순히

값 JSON에는 없습니다. 해당 값 어휘는 개체, 배열, 문자열, 숫자, `true`, `false` 및 `null`입니다. `undefined`, `NaN`, `Infinity`, 함수, 정규식, BigInt 또는 날짜 리터럴이 없습니다. 문법에는 주석이 없으며 숫자에는 16진수, 2진수, 선행 더하기 기호 또는 JavaScript 숫자 구분 기호를 사용할 수 없습니다. 빌린 각 구성은 결국 유효한 JSON 값을 시작하거나 계속할 수 없는 문자에 도달합니다.

변환에는 철자법보다는 데이터 결정이 필요합니다. 명시적인 빈 값이 애플리케이션 계약과 일치하는 경우에만 `undefined`을 `null`로 바꿉니다. 그렇지 않으면 멤버를 제거하거나 실제 값을 제공하십시오. 날짜를 합의된 문자열(종종 ISO 8601)로 인코딩합니다. JSON 토큰을 만드는 대신 수신 API에 따라 무한한 숫자를 나타냅니다.

작업된 예: 콘솔 덤프를 유효한 JSON로 변환

작업된 예: 콘솔 덤프를 유효한 JSON로 변환 — `{name: 'Ada', active: true, score: NaN, updated: new Date()}`로 시작합니다. `name`, `active`, `score` 및 `updated`는 큰따옴표로 묶습니다. 이름 값을 큰따옴표로 묶은 문자열로 변경합니다. 사용할 수 없는 점수는 `null`이어야 한다고 결정하고 생성자 표현식을 생성하려는 실제 타임스탬프 문자열로 바꿉니다. 이제 문서에는 JSON 멤버와 값만 포함됩니다.

완성된 모양은 `{"name":"Ada","active":true,"score":null,"updated":"2026-03-21T10:00:00Z"}`일 수 있습니다. 첫 번째 오류로 인해 이후의 JavaScript 전용 구문이 숨겨질 수 있으므로 각 복구 범주 후에 유효성을 검사하십시오. 허용된 결과의 형식을 지정하면 추가 변환을 수행하지 않고도 해당 구조가 노출됩니다.

역 트랩 — 매우 큰 정수 및 __proto__ 키와 같이 JavaScript가 다르게 읽을 수 있는 유효한 JSON

역방향 트랩 — 유효한 JSON은 구문 분석 후에도 JavaScript 관련 동작 또는 제한 사항을 얻을 수 있습니다. JSON 숫자에는 문법에 내장된 정밀도 제한이 없지만 JSON.parse는 JavaScript 숫자 값을 생성합니다. 따라서 안전 범위를 벗어난 정수는 자동으로 반올림될 수 있습니다. 모든 숫자가 중요한 경우 식별자를 문자열로 인코딩하거나 성공적인 구문 검사를 신뢰하는 대신 임의의 정밀도 숫자를 보존하도록 설계된 파서 및 데이터 유형을 사용하십시오.

멤버 이름 `"__proto__"`도 유효합니다. JSON 및 JSON.parse는 이를 자체 데이터 속성으로 생성합니다. 애플리케이션 코드가 안전하지 않은 할당 또는 병합 동작을 사용하여 구문 분석된 속성을 다른 개체에 복사하는 경우 나중에 문제가 시작될 수 있습니다. 유효성 검사는 텍스트가 JSON 문법을 따른다는 것을 증명합니다. 모든 키가 모든 소비자에게 안전하다는 것을 증명하는 것은 아닙니다.

여기서 다루지 않는 내용

여기서 다루지 않는 내용 — 의도적으로 주석, 후행 쉼표, 따옴표가 없는 이름 또는 작은 따옴표로 묶인 문자열을 허용하는 JSON5, JSONC 및 구성 언어입니다. 이러한 형식은 다양한 작성 문제를 해결하며 자체 문법을 구현하는 파서가 필요합니다. 엄격한 JSON 유효성 검사기는 이를 자동으로 재해석해서는 안 됩니다. 추가 구문을 허용하면 실제로 표준 JSON이 필요한 API, 패키지 메타데이터 및 기타 대상에 대한 결과가 잘못될 수 있기 때문입니다.

이 구별은 임의의 JavaScript 평가도 제외합니다. 단순히 객체 리터럴을 데이터로 변환하기 위해 `eval` 또는 함수 생성자를 통해 붙여넣은 텍스트를 실행하면 getter, 호출 또는 기타 적대적인 표현식이 실행될 수 있습니다. 소스가 신뢰할 수 있는 JavaScript인 경우 JSON.stringify를 사용하여 실제 값을 직렬화합니다. 출처가 신뢰할 수 없는 텍스트라면 실행하지 마세요.

요점: 리터럴은 코드이고 JSON는 데이터입니다.

요약: 리터럴은 코드이고, JSON은 데이터입니다. 시각적 유사성으로 인해 문법이 서로 호환되지는 않습니다. JSON에는 큰따옴표로 묶인 문자열과 멤버 이름이 필요하며 작은 고정 값 유형 집합만 허용하고 주석이나 실행 가능한 표현식을 포함하지 않습니다. 행 및 열 진단은 복사된 소스가 해당 문법을 남기는 첫 번째 위치를 표시합니다. 해당 지점을 복구하고 다시 검증하는 것이 콘솔 덤프에 광범위한 검색 및 바꾸기를 적용하는 것보다 더 안정적입니다.

JavaScript 값을 제어할 때 콘솔 표현을 복사하는 대신 JSON.stringify를 사용하여 JSON을 생성하세요. 텍스트를 받으면 선언된 형식에 대한 파서로만 구문 분석하고 바로가기로 실행하지 마십시오. JSON 유효성 검사에 성공하면 숫자 정밀도, 스키마 적합성 또는 안전한 다운스트림 속성 처리가 아닌 구문이 설정됩니다.