JSON 키는 따옴표로 묶어야합니까?


235

예 : 다음 코드는 JSON 사양에 유효 합니까?

{
    precision: "zip"
}

아니면 항상 다음 구문을 사용해야합니까? (그렇다면 왜?)

{
    "precision": "zip"
}

JSON 사양에서 이것에 대해 실제로 찾지 못했습니다. 예제에서 키 주위에 따옴표를 사용하지만.

답변:


147

예, 따옴표가 필요합니다. 이것은 더 간단하게하고 자바 스크립트 예약 키워드에 대해 다른 이스케이프 메소드가 필요하지 않도록하는 것 {for:"foo"}입니다.


12
따옴표는 수동으로 편집하는 구성 파일과 같은 많은 상황에서 더 간단하지 않습니다. 거의 보편적 인 교환 형식으로 사용 (및 오용)되는 JSON에 대한 불행한 점은 Javascript 전용 기능이 있다는 것입니다.
miguel

12
실제 이유-이 답변도 확인하십시오.- stackoverflow.com
questions

3
Tl; dr : 예약되지 않은 예약 키워드에 대한 ECMAScript 제한을 키로 처리하고 싶지 않았으므로 모든 키를 인용해야했습니다.
BallpointBen

136

문자열을 키로 사용하는 것이 맞습니다. 다음은 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 ; "

여기 에서 전체 RFC를 읽으 십시오 .


11
그리고 생각을 끝내기 위해 섹션 2.5는 다음과 같이 말합니다 A string begins and ends with quotation marks..
rakslice

13

에서 2.2. 사물

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

그리고 2.5에서. 현

문자열은 따옴표로 시작하고 끝납니다.

따라서 표준에 따르면 : 예, 항상 키를 인용해야합니다 (일부 파서가 더 용서 할 수는 있지만)


7

따옴표는 필수입니다. http://json.org/ 는 말합니다 :

string
    ""
    " chars "

0

그렇습니다. 그러나 다른 방법이 필요한 경우 JSON5를 확인 하십시오 .

JSON5 는 다음을 포함하여 ES5 구문을 허용하는 JSON의 상위 집합입니다.

  • 따옴표없는 속성 키
  • 작은 따옴표, 이스케이프 및 여러 줄 문자열
  • 대체 숫자 형식
  • 코멘트
  • 여분의 공백

JSON5 참조 구현 ( json5npm package )은 내장 오브젝트 와 동일한 인수 및 의미 JSON5를 갖는 메소드 parsestringify메소드를 제공 JSON합니다.


-2

"parent.child"점선 표기법을 사용할 수 있고 또한 유효하고 유용한 parent [ "child"]를 넣을 필요가 없기 때문에 두 가지 방법 모두 기술적으로 허용됩니다. 파서는 모두 두 가지 방법 모두 잘 수행해야합니다. 파서가 키에 따옴표가 필요하지 않으면 따옴표를 넣지 않는 것이 좋습니다 (공간 절약). 문자열을 문자열이라고 부르는 것이 합리적이며 대괄호는 키 값을 사용할 수 있기 때문에 본질적으로 완벽하지 않습니다. Json에서 당신은 넣을 수 있습니다 ...

>var keyName = "someKey";
>var obj = {[keyName]:"someValue"};

>obj
Object {someKey: "someValue"}

아무 문제없이, 키 값이 필요하고 따옴표가 없으면 작동하지 않으므로 그렇게 할 수 없으므로 "키에 따옴표가 필요하지 않습니다". 그것이 기술적으로 문자열이라고 말하는 것이 옳더라도. 논리와 사용법은 그렇지 않다고 주장한다. 이 예제에서는 모든 브라우저의 콘솔에서 실행되는 obj의 Object { "someKey": "someValue"}를 공식적으로 출력하지도 않습니다.


2
수락 된 답변과 JSON을 정의하는 RFC는 따옴표가 필요하다고 말합니다.
Keith Thompson

사실이지만 논리적으로 필요하지 않다는 점은 주목할 가치가 있습니다. 모든 브라우저 콘솔의 JavaScript Object Notation 출력이 잘못되었다고 가정하고 누군가에게 수정하도록 지시해야합니다. 브라우저 콘솔이 객체에 대해 출력하는 것은 JSON이 아니므로 사양에 정의 된 JSON은 대부분의 장소에서 필요하지 않거나 구현되지 않을 수 있습니다. 어쨌든 나는 단지 사실을 다른 관점에서 바라본 사례를 만들고 싶었습니다. 실제로 사양을 변경해야 할 수도 있습니다. "Quoted Keys"는 개인적으로 중요한 위치에 필요하지 않습니다. (실제로는 그렇게 사용되지 않았습니다.)
James James

2
JSON, JavaScript 객체 리터럴 및 브라우저 개발자 도구 콘솔 출력의 세 가지를 혼합하고 있습니다. obj콘솔에 사용자를 입력 하면 브라우저에 사람이 읽을 수있는 개체 표현이 표시됩니다. 그것은 당신의 예제에서와 같이 객체 리터럴로 표시하거나 대화 형 표현과 같은 다른 표현을 사용할 수 있습니다. 키가 예약어가 아닌 유효한 식별자 인 경우 JavaScript 객체 리터럴에는 키 이름을 따옴표로 묶을 필요가 없습니다. 그러나 JSON에는 항상 키 이름 주위에 따옴표가 필요합니다.
Michael Geary

3
추가 예제로 obj콘솔 에 입력하는 대신을 시도하십시오 JSON.stringify(obj). 이제 인용 된 키 이름으로 완성 된 객체의 유효한 JSON 표현을 볼 수 있습니다. 반대로 문자열이 유효한 JSON인지 확인하려면을 시도하십시오 JSON.parse(string). 키를 인용하지 않으면 예외가 발생합니다. 예를 들어 JSON.parse('{"a":"b"}')성공하지만 JSON.parse('{a:"b"}')실패합니다.
Michael Geary

1
OTOH, 당신의 사용 var obj = {[keyName]:"someValue"};은 매우 흥미 롭습니다! JavaScript 객체 리터럴로 그렇게 할 수 있다는 것을 몰랐습니다. 약간의 확인은 ES6에서 새로운 것으로 나타났습니다. ES5에서는 할 수 없었습니다.
Michael Geary
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.