JSON에서 각 이름이 인용되는 이유는 무엇입니까? 사양은 ​​문자열이 따옴표로 묶여 있다고 말합니다. 왜? 그러므로,

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

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

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

왜?

그러므로,

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

그리고 아닙니다

{Property1:"Value1",Property2:18}

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


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



답변

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

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

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

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

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


답변

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

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

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

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

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

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


답변

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


답변

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

그러나 키에 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.

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


답변

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


답변

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

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


답변

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