developer tip

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

copycodes 2020. 9. 5. 10:05
반응형

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, using "identifier" instead of "key", wrote that "if an identifier happens to be a reserved word, it is interpreted as that word rather than as an identifier." This may be true, but I tried it without any trouble:

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

=> 6

About using quotes, Quentin wrote "...but you don't have to, unless [the key] contains certain characters (or combinations of characters that would make it a keyword)"

I found the former part (certain characters) is true, using the @ sign (in fact, I think $ and _ are the only characters that don't cause the error):

var a = {a@b:1};

=> Syntax error

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

=> 1

but the parenthetical about keywords, as I showed above, isn't true.

What I wanted works because the text between the opening { and the colon, or between the comma and the colon for subsequent properties is used as an unquoted string to make an object key, or, as Friedo put it, a variable name there doesn't get interpolated:

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

=> ABC123


If json describes objects, then in practise you get the following

var foo = {};

var bar = 1;

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

so then,

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

so even if your examples do produce the same result, their equivalents in "raw code" wouldn't. Maybe that's why?? dunno, just an idea.


It may reduce data size if quotes on name are only allowed when necessary

참고URL : https://stackoverflow.com/questions/2067974/in-json-why-is-each-name-quoted

반응형