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


87

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

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

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

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

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

유효한 예 :

{
  "keyName" : 34
}

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

{
   keyName : 34
}

20
"왜 제대로해야합니까?" 이것은 잘못된 마크 업으로 가득 찬 웹 사이트로 이끄는 일종의 게으른 사고입니다. 일부 브라우저에 큰 따옴표 필요한 경우 코드를 미래에 대비할 수 있습니다 .
meagar

21
"왜 제대로해야합니까?" -진정한 이익이 없다면 다른 누구도하지 않는 관습을 따르려고 애쓰는 이유는 무엇입니까? 아마도 당신은 게으른 생각과 실용주의를 혼동 할 것입니다.
Mark Rogers

15
@Mark- "아무도하지 않는다"... 그 아이디어는 어디서 얻었습니까? 모든 주요 플랫폼에 내장 된 JSON 직렬 변환기 는 적절한 인용을 수행합니다.
Nick Craver

7
@Mark Rogers PHP json_encode 함수는 예를 들어 큰 따옴표로 묶인 문자열과 함께 유효한 JSON을 생성합니다. 자바 스크립트에서 객체 리터럴을 생각하고 계십니까? 키를 인용하지 않고도 작동하지만 JSON은 아닙니다.
JAL

9
기록을 위해 몇 년 전에 이것을 게시했을 때 @JAL이 제안한 것처럼 JSON과 객체 리터럴 표기법의 차이점에 대해 혼란 스러웠습니다. 이 둘은 매우 유사한 구문을 가지고 있으며 이로 인해 궁극적으로 문제를 설명하는 데 약간의 혼란이 생겼습니다.
Mark Rogers

답변:


155

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).

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


1
@Mark, 천만에요. JSON은 단순히 언어에 구애받지 않는 데이터 교환 형식 이라는 점을 명심하십시오. 구문이 Javascript Object Literal 구문에서 영감을 받았더라도 둘 사이에는 차이가 있습니다 (따옴표로 묶인 키보다 훨씬 더 많음).
Christian C. Salvadó 2010

2
@CMS, 왜 큰 따옴표 만 사용해야합니까? JSON에서 작은 따옴표가 유효하지 않은 이유는 무엇입니까?
Pacerier 2014 년

1
JSON 표준을 가능한 한 단순하게 유지하기 위해 작은 따옴표는 허용되지 않습니다. JSON은 자바 스크립트의 하위 집합 일 필요가 있으며 가능한 많은 자바 스크립트를 구현할 필요가 없습니다.
thomasrutter

JSON5은 사양 상위 ES5 구문을 준수하고, 따라서 다른 것들 사이에 인용 부호가 키를 지원합니다. 라이브러리에는 호환 parsestringify방법이 있습니다.
Inigo

해당 호환성 테이블 링크 (답변 하단)에서 예약어 항목은 개체 / 배열 리터럴 확장 섹션 아래에 있습니다. 그리고 TL; DR, 나열된 모든 브라우저 (당신이 들어 본 모든 브라우저와 약 20 개 이상)는 모두 "예"라고 말합니다.
i336_

16

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

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

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

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

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

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


네, schonky json 서버 측을 생성하는 오래된 ajax 앱이 있었는데, 키 이름 주위에 큰 따옴표가 없어 jquery 1.4로 업그레이드 할 때 실패했습니다.
JAL

모든 주요 브라우저 JSON.parse가 올바르게 거부한다고 추가 할 수 있습니다.
Matthew Flaschen

이 유형의 잘못된 json으로 JQuery 1.4가 정확히 어떤 경우에 실패할까요?
Mark Rogers

1
@Mark-어쨌든 제대로 인용되지 않았거나 잘못된 문자가 있습니다 ... 기본적으로 잘못된 JSON으로 실패합니다.
Nick Craver

흥미 롭습니다. JQuery 1.4에 대한 제 경험이 아닙니다. 또한 jquery가 json 객체를 만드는 데 책임이 있다고 생각하지 않습니다. 브라우저의 자바 스크립트 인터프리터가하는 일이 아닌가요? Jquery json deserialization을 언급하고 있습니까?
Mark Rogers

-4

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

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

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


11
YAML은 JSON의 상위 집합이 아닙니다.
John Gibb

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.