452 Stimmen

Kann man in einem JSON-Objekt ein nachgestelltes Komma verwenden?

Bei der manuellen Erstellung eines JSON-Objekts oder -Arrays ist es oft einfacher, ein Komma am letzten Element des Objekts oder Arrays stehen zu lassen. Der Code für die Ausgabe aus einem Array von Strings könnte zum Beispiel so aussehen (in einem C++-ähnlichen Pseudocode):

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

Sie erhalten eine Zeichenkette wie

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

Ist das erlaubt?

296voto

brianb Punkte 3312

Leider die JSON-Spezifikation lässt kein nachgestelltes Komma zu. Es gibt ein paar Browser, die es zulassen, aber im Allgemeinen müssen Sie sich um alle Browser kümmern.

Im Allgemeinen versuche ich, das Problem umzudrehen und das Komma vor dem eigentlichen Wert einzufügen, so dass der Code am Ende so aussieht:

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("]");

Diese eine zusätzliche Codezeile in Ihrer for-Schleife ist kaum teuer...

Eine andere Alternative, die ich bei der Ausgabe einer Struktur in JSON aus einem Wörterbuch irgendeiner Form verwendet habe, ist, immer ein Komma nach jedem Eintrag anzuhängen (wie Sie es oben tun) und dann einen Dummy-Eintrag am Ende hinzuzufügen, der kein nachgestelltes Komma hat (aber das ist nur faul ;->).

Mit einem Array funktioniert das leider nicht so gut.

147voto

Ben Combee Punkte 16303

Nein. Die JSON-Spezifikation, die unter http://json.org erlaubt keine nachgestellten Kommas. Soweit ich weiß, lassen einige Parser sie beim Lesen einer JSON-Zeichenfolge stillschweigend zu, während andere Fehler ausgeben. Aus Gründen der Interoperabilität sollten Sie sie nicht einschließen.

Der obige Code könnte umstrukturiert werden, entweder um das Komma am Ende zu entfernen, wenn der Array-Terminator hinzugefügt wird, oder um das Komma vor den Elementen hinzuzufügen, wobei das Komma für das erste Element weggelassen wird.

117voto

Overflowee Punkte 1167

Einfach, billig, gut lesbar und funktioniert immer, unabhängig von den technischen Daten.

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

Die redundante Zuweisung an $delim ist ein sehr geringer Preis, der zu zahlen ist. Funktioniert auch genauso gut, wenn es keine explizite Schleife, sondern separate Codefragmente gibt.

25voto

Tobu Punkte 23823

Nachgestellte Kommas sind in JavaScript erlaubt, funktionieren aber nicht im IE. In der versionslosen JSON-Spezifikation von Douglas Crockford waren sie nicht zulässig, und da sie versionslos war, sollte sich das auch nicht ändern. Die ES5-JSON-Spezifikation erlaubte sie als Erweiterung, aber Crockfords RFC 4627 nicht, und mit ES5 wurden sie wieder verboten. Firefox folgten diesem Beispiel. Der Internet Explorer ist der Grund, warum wir keine schönen Dinge haben können.

19voto

Wie bereits gesagt wurde, erlaubt die JSON-Spezifikation (basierend auf ECMAScript 3) kein Komma am Ende. ES >= 5 erlaubt es, so dass Sie tatsächlich diese Notation in reinem JS verwenden können. Es wurde darüber gestritten, und einige Parser hat es unterstützen ( http://bolinfest.com/essays/json.html , http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas-no-longer-accepted/ ), aber es ist die spezifische Tatsache (wie auf http://json.org/ ), dass es sollte nicht in JSON arbeiten. Diese Sache gesagt ...

... Ich frage mich, warum niemand darauf hingewiesen hat, dass man die Schleife bei der 0ten Iteration aufteilen und die führend Komma anstelle des nachgestellten Kommas, um den Geruch von Vergleichscode und den tatsächlichen Leistungs-Overhead in der Schleife loszuwerden, was zu einem Code führt, der tatsächlich kürzer, einfacher und schneller ist (da keine Verzweigungen/Bedingungen in der Schleife) als andere vorgeschlagene Lösungen.

Z.B. (in einem C-ähnlichen Pseudocode, ähnlich dem von OP vorgeschlagenen Code):

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("]");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X