JSON에서 각 이름이 인용되는 이유는 무엇입니까?


91

JSON 사양 은 JSON이 객체 또는 배열이라고 말합니다. 물체의 경우

개체 구조는 0 개 이상의 이름 / 값 쌍 (또는 멤버)을 둘러싼 중괄호 쌍으로 표시됩니다. 이름은 문자열입니다. ...

그리고 나중에 사양은 ​​문자열이 따옴표로 묶여 있다고 말합니다.

왜?

그러므로,

{"Property1":"Value1","Property2":18}

그리고 아닙니다

{Property1:"Value1",Property2:18}

질문 1 : 이름 / 값 쌍의 이름이 인용되지 않은 식별자가되도록 허용하지 않는 이유는 무엇입니까?


질문 2 : Javascript로 평가할 때 위의 두 표현간에 의미 론적 차이가 있습니까?


1
@Bruno : XML에 대해 같은 방식으로 말할 수 있습니다 ... 슬프게도 일부는 XML을 프로그래밍 언어로 사용하려고 할 수 있습니다 ...
Mike DeSimone

2
+1 ... 특이한 모순처럼 보입니다 .... "따옴표 포함"은 표준 JSON을 만들지 만 eval()(예 : 자바 스크립트) 에서는 작동하지 않습니다 .
skaffman

2
@bruno, 아니. 확장하면 "자바 스크립트 객체 표기법"이됩니다.
Dave Archer

2
@skaffman — JavaScript에서 평가할 때 작동합니다.
Quentin

1
@Bruno-JSON은 데이터 형식입니다. "JSON에서"는 사양에 따라 형식이 지정된 데이터를 의미합니다.
Cheeso

답변:


57

질문 1 : 이름 / 값 쌍의 이름이 인용되지 않은 식별자가되도록 허용하지 않는 이유는 무엇입니까?

JSON의 디자인 철학은 "간단하게 유지"입니다.

"와 견적 이름은 "" 보다 훨씬 간단하다 당신이 이름을 인용 할 수있다 " "또는 '그러나 당신은 그들이 특정 문자 (또는 키워드 만들 것 문자의 조합)와 포함하지 않는 한 필요가 없습니다 '또는 "해야 할 수도 있습니다를 따라 인용 수 선택한 구분자 " .

질문 2 : Javascript로 평가할 때 위의 두 표현간에 의미 론적 차이가 있습니까?

아니요. JavaScript에서는 동일합니다.


3
아니요, 정확하지 않습니다. CMS에 정답이 있습니다. 이 대답은 실제 이유의 좋은 부작용입니다. 설명이 더 간단 할뿐만 아니라 식별자의 문자열에 대한 구문 분석 규칙을 재사용 할 수 있으므로 구문 분석기를 작성하는 것도 더 간단합니다.
Breton

그 외에도 식별자가 예약어 인 경우 식별자가 아닌 해당 단어로 해석된다는 점에서 약간의 의미 상 차이가 있습니다.
Breton

2
CMS의 답변에 +1, 맞습니다. 큰 따옴표는 코드 규칙이 아니지만 예약어를 개체의 키로 사용하지 않으려 고합니다. 예 : {property1 : "abc", this : "def"} is WRONG (이것은 예약 된 키워드)
Sorin Mocanu

질문 2 : 자바 스크립트의 작은 차이를 이용하여 JSON.parse기능 : JSON.parse('{"a":1}') 잘 작동JSON.parse('{a:1}')예외를 발생 .
nhnghia 19

@nhnghia — 질문 2는 소스 코드 JSON이 아닌 JavaScript로 평가하는 것 입니다. JSON.parseJavaScript로 구현 된 JSON 파서이며 JavaScript 파서가 아닙니다.
Quentin

134

나는 Douglas Crockford (JSON 표준의 창시자)가 Yahoo에게 준 프레젠테이션에서 인용문을 남깁니다.

그는 JSON 을 발견 한 방법 과 인용 된 키 를 사용하기로 결정한 이유 에 대해 이야기 합니다 .

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

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

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

여기 에서 전체 비디오와 대본을 찾을 수 있습니다 .


음 ... JSON 표준 의 창시자 ?! 나는 그것이 과장이라고 생각합니다. JSON은 JavaScript Object Notation이며 Javascript (ECMA) 사양에서 제공됩니다.
Sorin Mocanu

42
@Sorin : JSON과 JavaScript 개체 리터럴을 혼동하지 마십시오. JSON은 Crockford가 2006 ( tools.ietf.org/html/rfc4627 ) 에 제안한 언어에 구애받지 않는 데이터 교환 형식으로 , 그 문법은 JavaScript 객체 리터럴 ( bclary.com/2004/11/07/#a-11.1) 과 다릅니다. .5 ), 기본적으로 문자열 키만 허용 하고 값 object , array , number , string 또는 다음 리터럴 이름 중 하나 여야합니다 : false , null true . 자바 스크립트의 객체 리터럴은 식별자 , 문자열 리터럴 또는숫자 리터럴 , 값은 모든 유형이 될 수 표현 ...
기독교 C. Salvadó

@CMS 그리고 오늘날의 자바 스크립트는 객체 생성자 표현식 안에 속기 식별자를 허용합니다. 예 : { a }속성 'a'는 전역 또는 지역 변수 'a'의 값을 복사합니다.
Hydroper

@CMS 그리고 계산 된 키도 있습니다.{[key]: value}
Hydroper

0

:식별자에 공백과 공백이 모두 허용됩니다. 따옴표가 없으면 식별자를 정확히 구성하는 것이 무엇인지 확인하려고 할 때 모호함이 발생합니다.


0

자바 스크립트에서 객체는 키 쌍이있는 해시 / 해시 테이블처럼 사용할 수 있습니다.

그러나 키에 javascript가 이름으로 토큰화할 수없는 문자가있는 경우 키가 아닌 객체의 속성처럼 액세스를 시도 할 때 실패합니다.

var test  = {};
test["key"] = 1;
test["#my-div"] = "<div> stuff </div>";

// test = { "key": 1, "#my-div": "<div> stuff </div>" };

console.log(test.key);           // should be 1
console.log(test["key"]);        // should be 1
console.log(test["#my-div"]);    // should be "<div> stuff </div>";
console.log(test.#my-div);       // would not work.

식별자에는 때때로 자바 스크립트에서 토큰 / 식별자로 평가할 수없는 문자가있을 수 있으므로 일관성을 위해 모든 식별자를 문자열에 넣는 것이 가장 좋습니다.


-2

Cheeso의 질문에 대한 정답은 구현이 문서를 능가한다는 것입니다. 더 이상 키로 문자열이 필요하지 않습니다. 문자열 (예 : 따옴표) 또는 (아마도) 변수 이름으로 사용될 수있는 모든 것이 될 수 있습니다. , 또는 $이며 문자, 숫자, $ 및 _ 만 포함합니다.

나는 내가 한 것과 같은 아이디어 로이 질문을 방문하는 다음 사람을 위해 나머지를 단순화하고 싶었습니다. 여기 고기가 있습니다.

객체 키로 사용될 때 변수 이름은 JSON에서 보간되지 않습니다 (Frido에게 감사드립니다!).

Breton은 "키"대신 "식별자"를 사용하여 "식별자가 예약어 인 경우 식별자가 아닌 해당 단어로 해석됩니다"라고 썼습니다. 이것은 사실 일 수 있지만 문제없이 시도했습니다.

var a = {do:1,long:2,super:3,abstract:4,var:5,break:6,boolean:7};
a.break

=> 6

Quentin은 따옴표 사용에 대해 "...하지만 [키]에 특정 문자 (또는 키워드로 만드는 문자 조합)가 포함되어 있지 않으면 그럴 필요가 없습니다."라고 썼습니다.

@ 기호를 사용하여 이전 부분 (특정 문자)이 사실임을 발견했습니다 (사실 $ 및 _가 오류를 일으키지 않는 유일한 문자라고 생각합니다).

var a = {a@b:1};

=> 구문 오류

var a = {"a@b":1};
a['a@b']

=> 1

그러나 위에서 보여준 키워드에 대한 괄호는 사실이 아닙니다.

내가 원했던 것은 {와 콜론 사이 또는 후속 속성의 쉼표와 콜론 사이의 텍스트가 객체 키를 만들기 위해 인용되지 않은 문자열로 사용되거나 Friedo가 말했듯이 변수 이름이 없기 때문에 작동합니다. t 보간 :

var uid = getUID();
var token = getToken();            // Returns ABC123
var data = {uid:uid,token:token};
data.token

=> ABC123


-3

json이 객체를 설명하면 실제로 다음을 얻습니다.

var foo = {};

var bar = 1;

foo["bar"] = "hello";
foo[bar] = "goodbye";

그럼,

foo.bar == "hello";
foo[1] == "goodbye" // in setting it used the value of var bar

따라서 예제가 동일한 결과를 생성하더라도 "원시 코드"의 해당 예제는 그렇지 않습니다. 아마도 그 이유는 ?? 몰라, 그냥 아이디어.


3
@David, 변수 이름은 객체 키로 사용될 때 JS에서 보간되지 않습니다. { bar: 'goodbye' }의 값으로 키 이름을 설정하지 않습니다 bar, 그것은 단지가 될 것입니다 bar. 사양에 따옴표가 필요한 이유에 대해서는 다른 사람들이 옳습니다. 키워드 및 특수 문자 충돌을 피하기위한 것입니다.
friedo

-3

이름에 따옴표가 필요할 때만 허용되는 경우 데이터 크기를 줄일 수 있습니다.

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