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
따라서 예제가 동일한 결과를 생성하더라도 “원시 코드”의 해당 예제는 그렇지 않습니다. 아마도 그 이유는 ?? 몰라, 그냥 아이디어.
답변
이름에 따옴표가 필요할 때만 허용되는 경우 데이터 크기를 줄일 수 있습니다.