답변:
예, 따옴표가 필요합니다. 이것은 더 간단하게하고 자바 스크립트 예약 키워드에 대해 다른 이스케이프 메소드가 필요하지 않도록하는 것 {for:"foo"}
입니다.
문자열을 키로 사용하는 것이 맞습니다. 다음은 RFC 4627 에서 발췌 한 것 입니다. JavaScript 객체 표기법 (JSON)을위한 응용 프로그램 / json 미디어 유형
2.2. 사물
객체 구조는 0 개 이상의 이름 / 값 쌍 (또는 멤버)을 둘러싸는 중괄호 쌍으로 표시됩니다. 이름은 문자열 입니다. 각 이름 뒤에 단일 콜론이 나타나 이름과 값을 구분합니다. 단일 쉼표는 다음 이름과 값을 구분합니다. 객체 내 이름은 고유해야합니다.
object = begin-object [ member *( value-separator member ) ] end-object
member = string name-separator value
[...]
2.5. 현
문자열 표현은 C 프로그래밍 언어 제품군에서 사용되는 규칙과 유사합니다. 문자열은 따옴표로 시작하고 끝납니다. [...]
string = quotation-mark *char quotation-mark
quotation-mark = %x22 ; "
A string begins and ends with quotation marks.
.
따옴표는 필수입니다. http://json.org/ 는 말합니다 :
string
""
" chars "
그렇습니다. 그러나 다른 방법이 필요한 경우 JSON5를 확인 하십시오 .
JSON5 는 다음을 포함하여 ES5 구문을 허용하는 JSON의 상위 집합입니다.
JSON5 참조 구현 ( json5
npm package )은 내장 오브젝트 와 동일한 인수 및 의미 JSON5
를 갖는 메소드 parse
및 stringify
메소드를 제공 JSON
합니다.
"parent.child"점선 표기법을 사용할 수 있고 또한 유효하고 유용한 parent [ "child"]를 넣을 필요가 없기 때문에 두 가지 방법 모두 기술적으로 허용됩니다. 파서는 모두 두 가지 방법 모두 잘 수행해야합니다. 파서가 키에 따옴표가 필요하지 않으면 따옴표를 넣지 않는 것이 좋습니다 (공간 절약). 문자열을 문자열이라고 부르는 것이 합리적이며 대괄호는 키 값을 사용할 수 있기 때문에 본질적으로 완벽하지 않습니다. Json에서 당신은 넣을 수 있습니다 ...
>var keyName = "someKey";
>var obj = {[keyName]:"someValue"};
>obj
Object {someKey: "someValue"}
아무 문제없이, 키 값이 필요하고 따옴표가 없으면 작동하지 않으므로 그렇게 할 수 없으므로 "키에 따옴표가 필요하지 않습니다". 그것이 기술적으로 문자열이라고 말하는 것이 옳더라도. 논리와 사용법은 그렇지 않다고 주장한다. 이 예제에서는 모든 브라우저의 콘솔에서 실행되는 obj의 Object { "someKey": "someValue"}를 공식적으로 출력하지도 않습니다.
obj
콘솔에 사용자를 입력 하면 브라우저에 사람이 읽을 수있는 개체 표현이 표시됩니다. 그것은 당신의 예제에서와 같이 객체 리터럴로 표시하거나 대화 형 표현과 같은 다른 표현을 사용할 수 있습니다. 키가 예약어가 아닌 유효한 식별자 인 경우 JavaScript 객체 리터럴에는 키 이름을 따옴표로 묶을 필요가 없습니다. 그러나 JSON에는 항상 키 이름 주위에 따옴표가 필요합니다.
obj
콘솔 에 입력하는 대신을 시도하십시오 JSON.stringify(obj)
. 이제 인용 된 키 이름으로 완성 된 객체의 유효한 JSON 표현을 볼 수 있습니다. 반대로 문자열이 유효한 JSON인지 확인하려면을 시도하십시오 JSON.parse(string)
. 키를 인용하지 않으면 예외가 발생합니다. 예를 들어 JSON.parse('{"a":"b"}')
성공하지만 JSON.parse('{a:"b"}')
실패합니다.
var obj = {[keyName]:"someValue"};
은 매우 흥미 롭습니다! JavaScript 객체 리터럴로 그렇게 할 수 있다는 것을 몰랐습니다. 약간의 확인은 ES6에서 새로운 것으로 나타났습니다. ES5에서는 할 수 없었습니다.