Können Sie in einem JSON-Objekt ein abschließendes Komma verwenden?

Wenn Sie ein JSON-Objekt oder -Array manuell generieren, ist es oft einfacher, ein nachkommendes Komma für das letzte Objekt im Objekt oder Array zu hinterlassen. Zum Beispiel könnte Code, der aus einem Array von Strings ausgegeben wird, so aussehen (in einem C ++ - ähnlichen Pseudocode):

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

dir eine Schnur geben

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

Ist das erlaubt?

321
Interessanterweise (oder erschreckend) in IE 8 habe ich gerade gefunden, dass alert ([1, 2, 3,] .length) "4" anzeigt.
hinzugefügt der Autor Daniel Earwicker, Quelle
Ich habe mich auch gefragt, also ist das eine völlig vernünftige Frage.
hinzugefügt der Autor hoju, Quelle
Als Antwort auf die Idee, SO als soziales Lesezeichen für allgemeine Programmierfragen zu verwenden: Was könnte falsch daran sein, Inhalte hinzuzufügen, die unweigerlich mehr Programmierer (und ihre Expertise) auf die Seite bringen würden?
hinzugefügt der Autor dclowd9901, Quelle
Wie Jeff gesagt hat, ist es vollkommen in Ordnung, SO als ein "Notizbuch" von Dingen zu verwenden, für die man etwas Zeit aufwenden musste. Sicher, das ist am einfachen Ende dieser Art von Elementen, aber ich denke immer noch, es ist angemessen, zumal verschiedene Javascript-Engines damit anders umgehen werden.
hinzugefügt der Autor pkaeding, Quelle
@DanielEarwicker: Irrelevant, da das nicht JSON ist.
hinzugefügt der Autor Lightness Races in Orbit, Quelle
Wenn JSON nicht für JavaScript-Engines ist, warum lautet der Name "JavaScript Object Notation"?
hinzugefügt der Autor James Curran, Quelle
Es war etwas, was ich vor ein paar Tagen im Internet suchen musste. Ich habe hier keine Antwort auf SO gesehen, also habe ich beim Befolgen der Mission der Site die Frage gestellt und sie beantwortet, damit andere sie finden können. Das ist etwas, was Jeff ausdrücklich gesagt hat, dass er hier getan haben wollte.
hinzugefügt der Autor Ben Combee, Quelle
Vielen Dank! Ich wollte das Etikett nicht selbst entfernen.
hinzugefügt der Autor Ben Combee, Quelle
Aber noch etwas: Warum schreibt OP manuell JSON? Das ist ein klares Anti-Muster - man sollte immer eine Bibliothek zum Erzeugen von JSON oder zum Umwandeln in/aus der Objektstruktur, die die Sprache hat, verwenden. Die Verwendung der String-Verkettung erfordert nur Probleme. nicht nur für Kommas, sondern auch für Kodierung, Flucht, falsche Verschachtelung. Es ist genau so schlimm wie die Verwendung von String-Manipulation oder Regexps für XML.
hinzugefügt der Autor StaxMan, Quelle
Mit etwas so Grundlegendem, dass die Antwort gefunden wird, indem man auf die offizielle Spezifizierung schaut, klingt dieses mehr wie Fischen nach Punkten als das Geben von nützlichen Antworten zu den ungelösten Problemen. Tut mir leid Kumpel.
hinzugefügt der Autor eyelidlessness, Quelle
Für das, was es wert ist, meine Beschwerde war nicht, dass die Frage einfach ist (Ich habe hier gerne eine Reihe von einfachen Fragen beantwortet), aber dass es erschien (auf den ersten Blick), eine Frage auf Gaming-Reputation-Punkte ausgerichtet sein. Sie werden auch bemerken, dass ich eingeräumt habe, dass die Frage nach einer Diskussion gültig ist.
hinzugefügt der Autor eyelidlessness, Quelle
Ich habe das Frage-Tag entfernt, weil es offensichtlich ist, dass es nicht so gut bekannt ist, wie es sein sollte, obwohl es in der offiziellen Spezifikation explizit aufgeführt ist.
hinzugefügt der Autor eyelidlessness, Quelle
Weil Javascript-Objektliterale das Format inspiriert haben. Meinst du nicht, dass JS Engines gerade erst damit beginnen JSON-Fähigkeiten zu haben? simonwillison.net/2006/Dec/20/json Aber JSON hat viele Einschränkungen nicht von JS auferlegt, z. JS-Objektliterale benötigen keine in Anführungszeichen gesetzten Schlüssel.
hinzugefügt der Autor eyelidlessness, Quelle
Außerdem gehen JS-Engines, die es anders behandeln, davon aus, dass JS JSON (derzeit) nicht versteht und es einfach als ein Objekt-/Array-Literal behandelt. Der Unterschied ist ein Unterschied in der Engine-Behandlung von Objekt/Array-Literalen, die nicht gleich wie JSON sind.
hinzugefügt der Autor eyelidlessness, Quelle
JSON ist nicht für Javascript-Engines gedacht, es ist ein universelles Datenaustauschformat. Es gibt keinen Platz für Fehler in der Antwort auf die Frage, weil es eindeutig spezifiziert ist.
hinzugefügt der Autor eyelidlessness, Quelle
Wenn es ein Trost ist, habe ich nicht downvote, ich habe nur das Tag hinzugefügt, weil ich dachte, es wäre angemessen.
hinzugefügt der Autor eyelidlessness, Quelle
Ich bin damit einverstanden, dass dies eine gute Frage ist. Ich kam hierher, indem ich die Frage googelte.
hinzugefügt der Autor fool4jesus, Quelle

14 Antworten

Leider erlaubt die JSON-Spezifikation kein nachkommendes Komma. Es gibt ein paar Browser, die es erlauben, aber im Allgemeinen müssen Sie sich um alle Browser kümmern.

Im Allgemeinen versuche ich, das Problem zu umgehen, und füge das Komma vor dem eigentlichen Wert hinzu, so dass du am Ende Code mit folgendem Aussehen erhältst:

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 zusätzliche Codezeile in Ihrer for-Schleife ist kaum teuer ...

Another alternative I've used when output a structure to JSON from a dictionary of some form is to always append a comma after each entry (as you are doing above) and then add a dummy entry at the end that has not trailing comma (but that is just lazy ;->).

Funktioniert leider nicht gut mit einem Array.

179
hinzugefügt
Es ist wirklich eine Schande, dass ECMA5 Trailings spezifiziert, aber JSON nicht.
hinzugefügt der Autor FlavorScape, Quelle
Toller Tipp zum Hinzufügen eines Dummy-Eintrags am Ende!
hinzugefügt der Autor dcsan, Quelle
Ja, diese zusätzliche Linie ist kaum teuer, aber ein Ärgernis trotzdem.
hinzugefügt der Autor René Nyffenegger, Quelle
Dieser Ansatz funktioniert für indizierte For-Schleifen. Wie wäre es mit ... in Style Loops? Gibt es einen eleganten Weg?
hinzugefügt der Autor sam, Quelle
Wenn Sie verschleierten Code mögen, können Sie das zusätzliche Anhängen vermeiden: s.appendF (& ", \"% d \ "" [! I], i); . Sie könnten es zu "..." +! I vereinfachen, aber der Compiler warnt möglicherweise vor einer Stringarithmetik.
hinzugefügt der Autor Marcelo Cantos, Quelle
Gute Antwort. Bitte geben Sie einen "Beweis" (einen Link zu Dokumenten, Spezifikationen usw.) Ihrer Antwort an.
hinzugefügt der Autor chharvey, Quelle
Nun, jetzt habe ich eine Aufgabe, einen Syntaxbaum in einer Form von JSON zu schreiben, während er von einem Stapelautomaten erzeugt wird. Ich kann diesen Trick leider nicht verwenden.
hinzugefügt der Autor Calmarius, Quelle
Gibt es eine Möglichkeit, Firefox dazu zu bringen, sich in dieser Hinsicht wie IE zu verhalten und einen Fehler oder zumindest eine Warnung zu erzeugen, wenn ein nachkommendes Komma gefunden wird? Ich entwickle hauptsächlich in Firefox, daher wäre es schön, sobald wie möglich über dieses Problem informiert zu werden.
hinzugefügt der Autor Michael Butler, Quelle
Die Antwort wurde aktualisiert, um die Frage explizit zu beantworten. Ich stimme zu, meine erste Antwort übersprang das explizite "Nein".
hinzugefügt der Autor brianb, Quelle
Diese zusätzliche Codezeile kann beim Umgang mit Eigenschaften kompliziert sein. Du findest vielleicht Tonnen von if s, nur um dieses dumme kleine Komma zu vermeiden. Über die Kosten YMMV, siehe zum Beispiel jsfiddle.net/oriadam/mywL9384 Klarstellung: Ihre Lösung ist großartig Ich hasse nur Spezifikationen, die ein abschließendes Komma verbieten.
hinzugefügt der Autor oriadam, Quelle
Ich habe begonnen, diese Formatierung in meinem gesamten JS-Code (Komma vor dem Element in derselben Zeile) genau aus diesem Grund zu verwenden. Macht zusätzliche Kommas viel einfacher zu erkennen und spart viel Zeit. Es ist nervig, ich wünschte, es gäbe eine Option, um einen Fehler mit Firefox zu verursachen (da das beim Debuggen helfen würde).
hinzugefügt der Autor rocketmonkeys, Quelle

Nein. Die JSON-Spezifikation, die unter http://json.org gepflegt wird, lässt keine abschließenden Kommas zu. Von dem, was ich gesehen habe, können einige Parser sie beim Lesen einer JSON-Zeichenfolge stillschweigend erlauben, während andere Fehler werfen. Aus Gründen der Interoperabilität sollten Sie es nicht einschließen.

Der obige Code könnte neu strukturiert werden, um entweder das nachgestellte Komma beim Hinzufügen des Array-Terminators zu entfernen oder um das Komma vor den Elementen hinzuzufügen, wobei das für den ersten weggelassen wird.

113
hinzugefügt
Und das ist die richtige Antwort auf die Frage.
hinzugefügt der Autor cdiggins, Quelle
ECMA 262 Scheint, es in Abschnitt 11.1.5-Object Initialiser zu definieren. Ob das gut ist oder nicht, scheint in der Spezifikation zu sein.
hinzugefügt der Autor Zero Distraction, Quelle
@ZeroDistraction: ECMA262 definiert ECMAscript (auch JavaScript genannt), eine Programmiersprache wie Perl oder ruby oder C ++ oder Java. JSON ist ein Datenformat wie xml oder CSV oder YAML. Sie sind nicht dasselbe. JSON existiert nicht in EXMA262, aber die Syntax, von der es abgeleitet ist, wird als Objekt-Literal-Notation (das ON in JSON) bezeichnet.
hinzugefügt der Autor slebetman, Quelle
Ein gültiges ECMAScript bedeutet nicht notwendigerweise, dass ein Dokument gültig ist. JSON - JSON wird im Allgemeinen in RFC 4627 , und diese Spezifikation lässt das nachfolgende Komma nicht zu.
hinzugefügt der Autor Tim Gilbert, Quelle

Einfach, billig, einfach zu lesen und funktioniert immer unabhängig von den Spezifikationen.

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

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

96
hinzugefügt
Das ist, was ich normalerweise in solchen Situationen mache; Ich denke, die zusätzliche Zuweisung wird mehr als ausgeglichen, indem die Bedingung beseitigt wird, die zum Anhängen des Kommas vor dem Wert im alternativen Ansatz erforderlich ist ( stackoverflow.com/ a/201856/8946 ).
hinzugefügt der Autor Lawrence Dol, Quelle
Außerdem ist es besser, den Gültigkeitsbereich des Trennzeichens zu enthalten: für (let ..., sep = ""; ...; sep = ",") {...
hinzugefügt der Autor Lawrence Dol, Quelle
Ich mag diese Lösung nicht, da eine andere Variable meinen Bereich verschmutzt. Ein wenn leichter zu verstehen ist. Aber danke fürs Teilen.
hinzugefügt der Autor Ich, Quelle

Nachgestellte Kommas sind in JavaScript erlaubt, funktionieren aber nicht in IE. Douglas Crockfords versionslose JSON-Spezifikation erlaubte sie nicht, und weil es versionslos war, sollte sich das nicht ändern. Die ES5 JSON-Spezifikation erlaubte ihnen eine Erweiterung, aber Crockfords RFC 4627 tat dies nicht, und ES5 kehrte zurück um sie zu verbieten. Firefox folgte. Internet Explorer ist der Grund, warum wir keine schönen Dinge haben können.

15
hinzugefügt
Ich habe sie einfach in IE 11 ohne Probleme ausprobiert. In welchen IE-Versionen hast du getestet, wo du Probleme gefunden hast?
hinzugefügt der Autor iconoclast, Quelle
Scheint so, als ob Crockford der Grund dafür ist, dass wir keine schönen Dinge haben können. Das und Kommentare in JSON
hinzugefügt der Autor Hejazzman, Quelle
hinzugefügt der Autor Tobu, Quelle

PHP-Programmierer möchten vielleicht implode() ausprobieren. Dies führt dazu, dass ein Array es mithilfe einer Zeichenfolge verbindet.

Aus der Dokumentation ...

$array = array('lastname', 'email', 'phone');
echo implode(",", $array);//lastname,email,phone
11
hinzugefügt
Ähnlich verhält es sich mit join() . Die meisten Sprachen haben eine ähnliche Methode, oder eine ähnliche kann leicht codiert werden.
hinzugefügt der Autor Dan Burton, Quelle
PHP hat json_encode, der alle Details zur Erstellung von JSON behandelt, nicht nur Kommas.
hinzugefügt der Autor Brilliand, Quelle
Die meisten Sprachen außer Java.
hinzugefügt der Autor Robert, Quelle

As it's been already said, JSON spec (based on ECMAScript 3) doesn't allow trailing comma. ES >= 5 allows it, so you can actually use that notation in pure JS. It's been argued about, and some parsers did support it (http://bolinfest.com/essays/json.html, http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas-no-longer-accepted/), but it's the spec fact (as shown on http://json.org/) that it shouldn't work in JSON. That thing said...

... Ich frage mich, warum niemand darauf hingewiesen hat, dass Sie die Schleife tatsächlich bei der 0. Iteration aufteilen können und führendes Komma anstelle eines nachfolgenden verwenden, um den Vergleichscode-Geruch und jede tatsächliche Leistung loszuwerden Overhead in der Schleife, was zu einem Code führt, der tatsächlich kürzer, einfacher und schneller ist (aufgrund von 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("]");
8
hinzugefügt

Interestingly, both C & C++ (and I think C#, but I'm not sure) specifically allow the trailing comma -- for exactly the reason given: It make programmaticly generating lists much easier. Not sure why JavaScript didn't follow their lead.

6
hinzugefügt
PHP erlaubt es auch. Ich denke, es ist die eine Eigenschaft von PHP, die ich mag. ; p
hinzugefügt der Autor iconoclast, Quelle
Nachgestellte Kommas funktionieren in Firefox, aber nicht in IE.
hinzugefügt der Autor kzh, Quelle
ECMA hat explizit festgelegt, dass nachfolgende Kommas in der kommenden Spezifikation erlaubt sind: ejohn.org/blog/bug-fixes-in-javascript-2 Noch ein weiterer Grund, klar zu sein, dass JSON! = JS Object.
hinzugefügt der Autor eyelidlessness, Quelle

Verwenden Sie JSON5. Verwenden Sie JSON nicht.

  • Objekte und Arrays können nachgestellte Kommas haben
  • Objektschlüssel können nicht angegeben werden, wenn sie gültige Bezeichner sind
  • Strings können einzeln zitiert werden
  • Strings können über mehrere Zeilen verteilt werden
  • Zahlen können hexadezimal sein (Basis 16)
  • Zahlen können mit einem (führenden oder nachgestellten) Dezimalzeichen beginnen oder enden.
  • Zahlen können Unendlichkeit und -Unendlichkeit enthalten.
  • Zahlen können mit einem expliziten Pluszeichen (+) beginnen.
  • Sowohl Inline- (einzeilige) als auch Block-Kommentare (mehrzeilig) sind erlaubt.

http://json5.org/

https://github.com/aseemk/json5

5
hinzugefügt
Auch sind mehrlinige Saiten schrecklich. Ich träume von ES6 Multilinien.
hinzugefügt der Autor Marco Sulla, Quelle
Sieht gut aus, aber das Hinzufügen neuer Datentypen scheint keine verpasste Chance zu sein ... natürlich zwingt der Wunsch, eine strikte Teilmenge von ECMAScript 5 zu bleiben, dazu, dass ...
hinzugefügt der Autor iconoclast, Quelle
Nein, das ist schrecklicher Ratschlag. Von allen vorhandenen JSON-Bibliotheken unterstützen nur sehr wenige solche Erweiterungen. und das alles für sehr fragwürdige "Verbesserungen". Bitte verursachen Sie keine weitere Erosion der Interoperabilität durch neue falsche Erweiterungen wie diese.
hinzugefügt der Autor StaxMan, Quelle
Ich glaube, dass es fürchterlicher ist, sein Leben damit zu verbringen, Kommas zu schreiben.
hinzugefügt der Autor user619271, Quelle

Ich halte eine aktuelle Anzahl und vergleiche sie mit einer Gesamtzahl. Wenn die aktuelle Anzahl kleiner als die Gesamtzahl ist, zeige ich das Komma an.

Funktioniert möglicherweise nicht, wenn vor dem Ausführen der JSON-Generierung keine Gesamtanzahl vorhanden ist.

Wenn Sie PHP 5.2.0 oder höher verwenden, können Sie Ihre Antwort einfach mit der integrierten JSON-API formatieren.

1
hinzugefügt

Aus meiner Erfahrung habe ich festgestellt, dass verschiedene Browser in JSON unterschiedliche Kommas behandeln.

Sowohl Firefox als auch Chrome machen es gut. Aber IE (Alle Versionen) scheint zu brechen. Ich meine wirklich brechen und hör auf den Rest des Drehbuchs zu lesen.

In Anbetracht dessen und auch der Tatsache, dass es immer schön ist, konformen Code zu schreiben, schlage ich vor, die zusätzlichen Anstrengungen zu unternehmen, um sicherzustellen, dass es kein abschließendes Komma gibt.

:)

1
hinzugefügt

Laut der Klasse JSONArray-Spezifikation :

  • Ein Extra (Komma) kann kurz vor der schließenden Klammer erscheinen.
  • Der Nullwert wird eingefügt, wenn (Komma) elision.
  • vorhanden ist

So wie ich es verstehe, sollte es erlaubt sein zu schreiben:

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

Aber es könnte passieren, dass einige Parser die 7 als Item Count zurückgeben (wie IE8, wie Daniel Earwicker darauf hingewiesen hat) statt der erwarteten 6.


Bearbeitet:

Ich habe diesen JSON-Validator gefunden, der eine JSON-Zeichenkette gegen RFC 4627 (Die Anwendung/json media type für JavaScript Object Notation) und gegen die JavaScript-Sprachspezifikation. Tatsächlich wird ein Array mit einem abschließenden Komma nur für JavaScript und nicht für die RFC 4627-Spezifikation als gültig angesehen.

In der RFC 4627-Spezifikation heißt es jedoch:

2.3. Arrays

     

Eine Array-Struktur wird als eckige Klammern um die Null dargestellt   oder mehr Werte (oder Elemente). Elemente werden durch Kommata getrennt.

 array = begin-array [Wert * (Wert-Trennwert)] end-array
 

Für mich ist das wieder ein Interpretationsproblem. Wenn Sie schreiben, dass Elemente durch Kommas getrennt sind (ohne etwas über Sonderfälle wie das letzte Element zu sagen), könnte es auf beide Arten verstanden werden.

P.S. RFC 4627 isn't a standard (as explicitly stated), and is already obsolited by RFC 7159 (which is a proposed standard) RFC 7159

1
hinzugefügt
Die Grammatikregel ist so präzise wie möglich. Es gibt keine Möglichkeit, einen Werttrenner ohne einen Wert direkt daneben zu haben. Auch der Text ist sehr spezifisch. Die "Trennung von Werten" kann nur angewendet werden, wenn mehrere Werte vorhanden sind. Wenn Sie also zwei Werte nebeneinander haben, werden sie durch ein Komma getrennt. Wenn Sie einen Wert haben (oder wenn Sie nur den Wert am Ende betrachten), gibt es keine Trennung, also kein Komma.
hinzugefügt der Autor Steffen Heil, Quelle

Ich schleife normalerweise über das Array und lege nach jedem Eintrag in der Zeichenfolge ein Komma an. Nach der Schleife lösche ich das letzte Komma wieder.

Vielleicht nicht der beste Weg, aber weniger teuer als jedes Mal, wenn es das letzte Objekt in der Schleife ist, denke ich.

0
hinzugefügt

Mit Relaxed JSON können Sie nachgestellte Kommas verwenden, oder lassen Sie die Kommas einfach aus . Sie sind optional.

Es gibt keinen Grund, dass Kommas vorhanden sein müssen, um ein JSON-ähnliches Dokument zu analysieren.

Werfen Sie einen Blick auf die Entspannte JSON-Spezifikation und Sie werden sehen, wie laut die ursprüngliche JSON-Spezifikation ist. Viel zu viele Kommas und Zitate ...

http://www.relaxedjson.org

Sie können auch Ihr Beispiel mit diesem Online-RJSON-Parser ausprobieren und sehen, wie er korrekt analysiert wird.

http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D

0
hinzugefügt

Es wird nicht empfohlen, aber Sie können immer noch so etwas tun, um es zu analysieren.

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

jsonStr = '[0,1,2,3,4,5,]';
let data;
eval('data = ' + jsonStr);
console.log(data)
</div> </div>
0
hinzugefügt
JavaScript - Deutsche Gemeinschaft
JavaScript - Deutsche Gemeinschaft
3 der Teilnehmer

In dieser Gruppe sprechen wir über JavaScript.