436

JSON オブジェクトまたは配列を手動で生成する場合、多くの場合、オブジェクトまたは配列の最後の項目に末尾のコンマを残す方が簡単です。たとえば、文字列の配列から出力するコードは (C++ のような疑似コードで) 次のようになります。

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

あなたに次のような文字列を与える

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

これは許されますか?

4

19 に答える 19

285

残念ながら、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ループの余分な1行のコードは、ほとんど費用がかかりません...

何らかの形式の辞書からJSONに構造を出力するときに使用した別の方法は、各エントリの後に常にコンマを追加し(上記のように)、最後にコンマのないダミーエントリを追加することです(ただし、それはただ怠惰です;->)。

残念ながら、アレイではうまく機能しません。

于 2008-10-14T16:19:55.650 に答える
139

いいえ。 http://json.orgで維持されている JSON 仕様では、末尾のコンマは許可されていません。私が見たところによると、一部のパーサーは JSON 文字列を読み取るときに暗黙のうちにそれらを許可する場合がありますが、他のパーサーはエラーをスローします。相互運用性のために、これを含めるべきではありません。

上記のコードは、配列ターミネータを追加するときに末尾のカンマを削除するか、項目の前にカンマを追加して、最初のカンマをスキップするように再構成できます。

于 2008-10-14T16:02:34.530 に答える
114

シンプルで安価で読みやすく、スペックに関係なく常に動作します。

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

$delim への冗長な代入は、非常に小さな代償です。明示的なループがなく、個別のコード フラグメントがある場合も同様に機能します。

于 2011-12-16T07:38:36.850 に答える
23

JavaScript では末尾のコンマを使用できますが、IE では機能しません。Douglas Crockford のバージョンレス JSON 仕様では、それらが許可されていませんでした。バージョンレスであるため、これを変更することは想定されていませんでした。ES5 JSON 仕様では拡張機能として許可されていましたが、Crockford のRFC 4627 では許可されておらず、ES5 はそれらを許可しないように戻しました。Firefoxもそれに続きました。Internet Explorer が原因で、すばらしいものを手に入れることができません。

于 2012-07-15T20:18:18.400 に答える
16

すでに述べたように、JSON 仕様 (ECMAScript 3 に基づく) では末尾のコンマを使用できません。ES >= 5 で許可されるため、純粋な JS で実際にその表記を使用できます。それについて議論されており、一部のパーサーそれをサポートしていました ( http://bolinfest.com/essays/json.htmlhttp://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas- no-longer-accepted/ ) ですが、JSON では機能しないことが仕様上の事実 ( http://json.org/に示されているように) です。そのことは言った...

... 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("]");
于 2014-04-12T17:06:51.343 に答える
11

PHP コーダーは、 implode()をチェックアウトすることをお勧めします。これは、文字列を使用して配列を結合します。

ドキュメントから...

$array = array('lastname', 'email', 'phone');
echo implode(",", $array); // lastname,email,phone
于 2008-10-16T07:26:38.813 に答える
9

興味深いことに、C と C++ の両方 (C# だと思いますが、確かではありません) では、末尾のコンマを明確に許可しています。JavaScript が彼らのリードに従わなかった理由は不明です。

于 2008-10-14T17:29:36.193 に答える
6

JSON5 を使用します。JSON を使用しないでください。

  • オブジェクトと配列には、末尾のコンマを含めることができます
  • 有効な識別子である場合、オブジェクト キーは引用符で囲まないことができます
  • 文字列は単一引用符で囲むことができます
  • 文字列は複数行に分割できます
  • 数値は 16 進数 (基数 16) にすることができます
  • 数値は、(先頭または末尾の) 小数点で開始または終了できます。
  • 数値には、Infinity と -Infinity を含めることができます。
  • 数値は明示的なプラス (+) 記号で始めることができます。
  • インライン (1 行) コメントとブロック (複数行) コメントの両方を使用できます。

http://json5.org/

https://github.com/aseemk/json5

于 2014-08-24T07:35:55.217 に答える
1

お勧めしませんが、このような方法で解析することはできます。

jsonStr = '[0,1,2,3,4,5,]';
let data;
eval('data = ' + jsonStr);
console.log(data)

于 2017-11-01T21:35:40.897 に答える
0

私の過去の経験から、ブラウザによって JSON の末尾のコンマの扱いが異なることがわかりました。

Firefox と Chrome の両方で問題なく処理されます。しかし、IE (すべてのバージョン) が壊れているようです。つまり、スクリプトの残りの部分を本当に中断して読むのをやめるということです。

このことと、コードに準拠したコードを書くことは常に良いことであるという事実を念頭に置いて、末尾にコンマがないことを確認するために余分な労力を費やすことをお勧めします。

:)

于 2011-10-14T15:59:24.593 に答える
0

現在のカウントを保持し、それを合計カウントと比較します。現在の数が合計数よりも少ない場合は、カンマを表示します。

JSON 生成を実行する前に合計数がない場合、機能しない可能性があります。

繰り返しになりますが、PHP 5.2.0 以降を使用している場合は、組み込みの JSON API を使用して応答をフォーマットできます。

于 2010-11-11T21:26:29.527 に答える
0

配列または同様の反復可能なデータ構造を反復処理するために for ループが使用されるため、示されているように配列の長さを使用できます。

awk -v header="FirstName,LastName,DOB" '
  BEGIN {
    FS = ",";
    print("[");
    columns = split(header, column_names, ",");
  }
  { print("  {");
    for (i = 1; i < columns; i++) {
      printf("    \"%s\":\"%s\",\n", column_names[i], $(i));
    }
    printf("    \"%s\":\"%s\"\n", column_names[i], $(i));
    print("  }");
  }
  END { print("]"); } ' datafile.txt

datafile.txt を含むと、

 Angela,Baker,2010-05-23
 Betty,Crockett,1990-12-07
 David,Done,2003-10-31
于 2019-03-01T03:34:54.607 に答える
-1

私は通常、配列をループして、文字列のすべてのエントリの後にコンマを付加します。ループの後、最後のコンマをもう一度削除します。

おそらく最善の方法ではありませんが、それがループ内の最後のオブジェクトであるかどうかを毎回チェックするよりも安価です。

于 2008-12-11T10:06:49.620 に答える