[javascript] JSON 키에 인용 문자열을 사용하는 실용적인 이유가 있습니까?

Crockford의 json.org 에 따르면 JSON 객체쌍으로 구성된 멤버 로 구성 됩니다 .

모든 쌍은 문자열 으로 구성되며 문자열 은 다음과 같이 정의됩니다.

문자열은 백 슬래시 이스케이프를 사용하여 큰 따옴표로 묶인 0 개 이상의 유니 코드 문자 시퀀스입니다. 문자는 단일 문자열로 표시됩니다. 문자열은 C 또는 Java 문자열과 매우 유사합니다.

그러나 실제로 대부분의 프로그래머는 대부분의 브라우저에서 큰 따옴표를 사용할 필요가 없기 때문에 JSON 키를 큰 따옴표로 묶어야한다는 사실조차 알지 못합니다.

JSON을 큰 따옴표로 묶는 것이 의미가 있습니까?

유효한 예 :

{
  "keyName" : 34
}

유효하지 않은 것과 반대로 :

{
   keyName : 34
}



답변

JSON 키를 따옴표로 묶어야하는 실제 이유는 ECMAScript 3의 식별자 의미에 의존합니다.

예약어 는 따옴표없이 개체 리터럴에서 속성 이름 으로 사용할 수 없습니다 . 예를 들면 다음과 같습니다.

({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...

따옴표를 사용하는 경우 속성 이름은 유효합니다.

({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok

자체 Crockford는 이 강연 에서 이를 설명하고 , JSON 표준을 단순하게 유지하기를 원했고 모든 의미 적 제한을 원하지 않을 것입니다.

….

그때 우리가 인용되지 않은 이름 문제를 발견했습니다. ECMA Script 3에는 예약어 정책이 있습니다. 예약어는 핵심 위치에 인용되어야하는데, 이는 정말 성가신 일입니다. 이것을 표준으로 공식화하려고했을 때 모든 예약어를 표준에 넣을 필요가 없었습니다. 왜냐하면 정말 멍청 해 보일 것이기 때문입니다.

그 당시 저는 사람들을 설득하려고 노력했습니다. 예, JavaScript로 애플리케이션을 작성할 수 있습니다. 실제로 작동 할 것이고 좋은 언어입니다. 나는 동시에 말하고 싶지 않았습니다. 그리고 그들이 한 정말 어리석은 일을보세요! 그래서 대신 열쇠를 인용 해 보겠습니다.
그렇게하면 아무에게도 그게 얼마나 엉망인지 말할 필요가 없습니다.

이것이 오늘날까지 키가 JSON으로 인용되는 이유입니다.

ECMAScript 5th Edition Standard는이 문제를 수정했으며 이제 ES5 구현에서 예약어조차도 객체 리터럴과 멤버 액세스 모두에서 따옴표없이 사용할 수 있습니다 ( obj.functionES5에서는 Ok).

기록을 위해이 표준은 요즘 소프트웨어 공급 업체에 의해 구현되고 있습니다.이 호환성 테이블 에서이 기능을 포함하는 브라우저를 확인할 수 있습니다 ( 속성 이름으로 예약어 참조 ).


답변

예, 유효하지 않은 JSON이며 그렇지 않으면 많은 경우 거부됩니다. 예를 들어 jQuery 1.4+에는 인용되지 않은 JSON이 자동으로 실패하도록하는 검사가 있습니다. 규정을 준수 하지 않는 이유는 무엇 입니까?

다른 예를 들어 보겠습니다.

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }

…이 모든 것들은 따옴표로 유효 할 것입니다 . 왜 일관성을 유지하고 모든 경우에 사용하여 문제의 가능성을 제거하지 않습니까?

웹 개발자 세계의 또 하나의 일반적인 예 : 대부분의 브라우저에서 렌더링되는 잘못된 HTML의 예가 수천 개 있습니다. 디버그 또는 유지 관리가 덜 고통 스럽습니까? 전혀 그렇지 않습니다. 그 반대입니다.

또한 @ Matthew 는 아래 주석에서 가장 좋은 점을 설명합니다. 이것은 이미 실패합니다. 인용되지 않은 키는 JSON.parse()모든 주요 브라우저 (및 올바르게 구현하는 다른 브라우저)에서 구문 오류를 발생시킵니다 . 여기서 테스트 할 수 있습니다 .


답변

실제로 JSON의 상위 집합 인 YAML은 원하는 작업을 지원합니다. 수퍼 세트이지만 원하는만큼 간단하게 유지할 수 있습니다.

YAML은 신선한 공기의 숨결이며 시간을내어 살펴볼 가치가 있습니다. 시작하기 가장 좋은 곳은 여기입니다 : http://en.wikipedia.org/wiki/YAML

JS를 포함한 모든 언어에 대한 libs가 있습니다. 예 : https://github.com/nodeca/js-yaml


답변