source

JSON에서는 왜 각각의 이름이 인용됩니까?

manysource 2023. 3. 21. 22:22

JSON에서는 왜 각각의 이름이 인용됩니까?

JSON 사양에 따르면 JSON은 객체 또는 어레이입니다.사물의 경우,

오브젝트 구조는 0개 이상의 이름/값 쌍(또는 멤버)을 둘러싼 한 쌍의 곱슬 괄호로 표시됩니다.이름은 문자열입니다.

그 후 사양에서는 문자열이 따옴표로 둘러싸인다고 합니다.

왜요?

따라서,

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

가 아니라

{Property1:"Value1",Property2:18}

질문 1: 이름/값 쌍의 이름을 따옴표로 묶지 않은 식별자로 허용하지 않는 이유는 무엇입니까?


질문 2: Javascript에서 평가할 때 위의 두 표현 사이에 의미 차이가 있습니까?

더글라스 크록포드(JSON 표준 작성자)가 야후에게 건넨 프레젠테이션에서 인용을 남깁니다.

JSON을 발견한 경위와 따옴표로 묶인 키를 사용하기로 결정한 이유에 대해 설명합니다.

그 때 따옴표가 없는 이름의 문제가 발견되었습니다.ECMA Script 3에는 sk reserved word 정책이 있는 것으로 나타났습니다.중요한 위치에 격언은 반드시 인용해야 하는데, 이것은 정말 귀찮은 일이다.이것을 표준으로 만들었을 때, 나는 모든 예약어를 표준 안에 넣고 싶지 않았다. 왜냐하면 그것은 정말 바보같이 보일 것이기 때문이다.

당시 저는 사람들을 설득하려고 했습니다.응, 어플리케이션은 JavaScript로 쓸 수 있어.실제로 동작할 수 있고, 좋은 언어라고.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 그래서 대신 열쇠를 인용하기로 했어요
그렇게 하면, 우리는 그것이 얼마나 큰지 아무에게도 말할 필요가 없다.

그래서 오늘날까지 JSON에서 키가 인용되고 있습니다.

완전한 영상과 대본은 여기에서 찾을 수 있습니다.

질문 1: 이름/값 쌍의 이름을 따옴표로 묶지 않은 식별자로 허용하지 않는 이유는 무엇입니까?

JSON의 설계 이념은 '간단함 유지'입니다.

"따옴표 "는 "이름을 따옴표로 묶을 수 있지만 따옴표로 묶을 필요가 없습니다.단, 특정 문자(또는 키워드로 만드는 문자의 조합) 포함되어 있거나 선택한 딜리미터에 따라 따옴표로 묶어야 할 경우가 있습니다."보다 훨씬 단순합니다.

질문 2: Javascript에서 평가할 때 위의 두 표현 사이에 의미 차이가 있습니까?

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

다.:및 공백은 식별자로 사용할 수 있습니다.따옴표가 없으면 식별자를 정확히 구성하려고 할 때 애매모호하게 됩니다.

javascript에서는 오브젝트를 해시/해시 테이블처럼 키쌍으로 사용할 수 있습니다.

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

식별자는 때때로 javascript에서 토큰/식별자로 평가되지 않는 문자를 가질 수 있습니다.따라서 일관성을 위해 모든 식별자를 문자열에 넣는 것이 가장 좋습니다.

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

그 때문에, 예를 들면, 같은 결과가 된다 해도, 「원시 코드」에 해당하는 것은 표시되지 않습니다.그래서일까?몰라, 그냥 생각일 뿐이야

Cheeso의 질문에 대한 정답은 구현이 문서를 능가한다는 것이라고 생각합니다.키로서 스트링을 필요로 하지 않고, 그 외의 것을 필요로 합니다.스트링(따옴표로 묶음) 또는 변수명으로 사용할 수 있는 모든 것(아마도)입니다.이것은 문자, _, 또는 $로 시작하고, $와 _만을 포함하는 것을 의미합니다.

다음 번에 이 질문을 방문하시는 분들을 위해 저와 같은 생각으로 나머지 부분을 단순화하고자 했습니다.여기 고기가 있습니다.

개체 키로 사용할 변수 이름은 JSON에서 보간되지 않습니다(Thanks Friedo!).

브레튼은 "키" 대신 "식별자"를 사용하여 "식별자가 우연히 예비어일 경우, 그것은 식별자로서가 아니라 그 단어로 해석된다"고 썼다.이것이 사실일 수도 있지만, 저는 아무 문제 없이 시도했습니다.

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

=> 6

인용문 사용에 대해 쿠엔틴은 "...하지만 [키]에 특정 문자(또는 키워드가 되는 문자의 조합)가 포함되지 않는 한 그럴 필요는 없습니다.

@ 기호를 사용하여 앞의 부분(특정 문자)이 참임을 확인했습니다(실제로 $와 _는 에러의 원인이 되지 않는 유일한 문자라고 생각합니다).

var a = {a@b:1};

=> 구문 오류

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

=> 1

근데 키워드에 대한 parentematic은 위에 보여드렸듯이 사실이 아닙니다.

원하는 것은 열림{과(와) 콜론 사이 또는 후속 속성을 위해 쉼표와 콜론 사이의 텍스트가 따옴표로 둘러싸인 문자열로 사용되거나 Friedo의 표현대로 변수 이름이 삽입되지 않기 때문입니다.

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

=> ABC123

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

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