[json] JSON 객체에서 후행 쉼표를 사용할 수 있습니까?

JSON 객체 또는 배열을 수동으로 생성 할 때 객체 또는 배열의 마지막 항목에 후행 쉼표를 남기는 것이 더 쉬운 경우가 많습니다. 예를 들어 문자열 배열에서 출력되는 코드는 유사 코드처럼 C ++에서 다음과 같이 보일 수 있습니다.

s.append("[");
for (i = 0; i < 5; ++i) {
    s.appendF("\"%d\",", i);
}
s.append("]");

당신에게 같은 문자열을 제공

[0,1,2,3,4,5,]

이것이 허용됩니까?



답변

불행히도 JSON 사양 은 후행 쉼표를 허용하지 않습니다. 이를 허용하는 몇 가지 브라우저가 있지만 일반적으로 모든 브라우저에 대해 걱정해야합니다.

일반적으로 문제를 해결하고 실제 값 앞에 쉼표를 추가하면 다음과 같은 코드가 나타납니다.

s.append("[");
for (i = 0; i < 5; ++i) {
  if (i) s.append(","); // add the comma only if this isn't the first entry
  s.appendF("\"%d\"", i);
}
s.append("]");

for 루프에있는 한 줄의 코드는 거의 비싸지 않습니다 …

일부 양식의 사전에서 JSON으로 구조를 출력 할 때 사용한 또 다른 대안은 각 항목 뒤에 항상 쉼표를 추가 한 다음 (위에서 수행하는 것처럼) 쉼표가 아닌 끝에 더미 항목을 추가하는 것입니다 (그러나 그것은 게으른;->)입니다.

불행히도 어레이와 잘 작동하지 않습니다.


답변

아니요. http://json.org 에서 유지 관리되는 JSON 사양 은 후행 쉼표를 허용하지 않습니다. 내가 본 것에서 일부 파서는 JSON 문자열을 읽을 때 자동으로 허용하지만 다른 파서는 오류를 발생시킵니다. 상호 운용성을 위해 포함시키지 않아야합니다.

위의 코드는 배열 종결자를 추가 할 때 후행 쉼표를 제거하거나 항목 앞에 쉼표를 추가하여 첫 번째 쉼표를 건너 뛰도록 재구성 될 수 있습니다.


답변

간단하고 저렴하며 읽기 쉽고 사양에 관계없이 항상 작동합니다.

$delimiter = '';
for ....  {
    print $delimiter.$whatever
    $delimiter = ',';
}

$ delim에 대한 중복 할당은 지불하기에 매우 작은 가격입니다. 명시적인 루프는 없지만 별도의 코드 조각이있는 경우에도 잘 작동합니다.


답변

후행 쉼표는 JavaScript에서 허용되지만 IE에서는 작동하지 않습니다. Douglas Crockford의 버전없는 JSON 사양에서는이를 허용하지 않았으며 버전이 없기 때문에 변경되지 않았습니다. ES5 JSON 사양은이를 확장으로 허용했지만 Crockford의 RFC 4627 은 그렇지 않았으며 ES5는이를 허용하지 않기로했습니다. 파이어 폭스가 뒤 따랐다. Internet Explorer는 우리가 좋은 것을 가질 수없는 이유입니다.


답변

이미 말했듯이 JSON 사양 (ECMAScript 3 기반)은 후행 쉼표를 허용하지 않습니다. ES> = 5가 허용하므로 실제로 순수 JS에서 해당 표기법을 사용할 수 있습니다. 논쟁이 있었고 일부 파서 그것을 지원했습니다 ( http://bolinfest.com/essays/json.html , http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas- no-longer-accepted / )이지만 사양 사실입니다 ( http://json.org/에 표시됨) ) 즉, 그것은 JSON에서 작동합니다. 그 말은 …

… 아무도 아무도 0 번 반복에서 루프를 분할하고 선행 쉼표를 사용하여 후행 코드 대신 비교 코드 냄새와 루프의 실제 성능 오버 헤드를 제거 할 수 있다고 지적한 이유가 무엇인지 궁금 합니다. 루프에서 분기 / 조건이 없기 때문에 실제로 짧고 간단하고 빠른 코드는 제안 된 다른 솔루션보다 낫습니다.

예 : (OP의 제안 코드와 유사한 C 스타일 의사 코드에서) :

s.append("[");
// MAX == 5 here. if it's constant, you can inline it below and get rid of the comparison
if ( MAX > 0 ) {
    s.appendF("\"%d\"", 0); // 0-th iteration
    for( int i = 1; i < MAX; ++i ) {
        s.appendF(",\"%d\"", i); // i-th iteration
    }
}
s.append("]");


답변

PHP 코더는 implode () 를 확인하고 싶을 수도 있습니다 . 배열이 문자열을 사용하여 결합됩니다.

로부터 문서

$array = array('lastname', 'email', 'phone');
echo implode(",", $array); // lastname,email,phone


답변

흥미롭게도 C & C ++ (그리고 C #이라고 생각하지만 확실하지는 않지만)는 특히 쉼표를 허용합니다. 정확히 이유 : 프로그래밍 방식으로 목록을 훨씬 쉽게 생성합니다. 왜 JavaScript가 그들의 주도를 따르지 않았는지 모르겠습니다.