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.function
ES5에서는 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