it-swarm.com.de

Können Sie ein nachfolgendes Komma in einem JSON-Objekt verwenden?

Beim manuellen Generieren eines JSON-Objekts oder -Arrays ist es oft einfacher, ein Nachkomma für das letzte Element des Objekts oder Arrays zu hinterlassen. Beispielsweise könnte Code, der aus einem String-Array ausgegeben werden soll, wie folgt aussehen (in einem C++ - ähnlichen Pseudocode):

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

dir eine Schnur zu geben

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

Ist das erlaubt?

342
Ben Combee

Leider erlaubt die JSON-Spezifikation kein nachfolgendes Komma. Es gibt einige Browser, die dies zulassen, aber im Allgemeinen müssen Sie sich um alle Browser kümmern.

Im Allgemeinen versuche ich, das Problem umzukehren und das Komma vor dem tatsächlichen Wert einzufügen, sodass am Ende Code angezeigt wird, der folgendermaßen 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 zusätzliche Zeile Code in Ihrer for-Schleife ist kaum teuer ...

Eine andere Alternative, die ich bei der Ausgabe einer Struktur aus einem Wörterbuch irgendeiner Form an JSON verwendet habe, besteht darin, nach jedem Eintrag immer ein Komma anzufügen (wie oben beschrieben) und dann am Ende einen Dummy-Eintrag hinzuzufügen, der kein Nachlauf-Komma (aber.) Hat das ist nur faul; ->).

Funktioniert leider nicht gut mit einem Array.

208
brianb

Nein. Die unter http://json.org gepflegte JSON-Spezifikation erlaubt keine nachgestellten Kommas. Soweit ich es gesehen habe, können einige Parser sie beim Lesen eines JSON-Strings stillschweigend zulassen, während andere Fehler werfen. Aus Gründen der Interoperabilität sollten Sie es nicht einschließen.

Der obige Code könnte umstrukturiert werden, um entweder das nachgestellte Komma beim Hinzufügen des Array-Abschlusszeichens zu entfernen oder das Komma vor den Elementen hinzuzufügen, wobei das erste für das erste Zeichen übersprungen wird.

123
Ben Combee

Einfach, günstig, leicht lesbar und funktioniert unabhängig von den Spezifikationen.

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

Die redundante Zuordnung zu $ ​​delim ist ein sehr kleiner Preis, der zu zahlen ist. __ Funktioniert auch gut, wenn es keine explizite Schleife gibt, sondern separate Code-Fragmente.

98
Overflowee

Nachgestellte Kommas sind in JavaScript erlaubt, funktionieren aber nicht im IE. Die versionlose JSON-Spezifikation von Douglas Crockford erlaubte es ihnen nicht, und da es sich um versionless handelte, sollte sich dies nicht ändern. Die ES5-JSON-Spezifikation erlaubte sie als Erweiterung, aber Crockfords RFC 4627 nicht und ES5 kehrte zurück, um sie nicht zuzulassen. Firefox folgte der Klage. Internet Explorer ist der Grund, warum wir keine schönen Dinge haben können.

19
Tobu

PHP-Codierer möchten implode () auschecken. Dazu muss ein Array mit einer Zeichenfolge verbunden werden.

Aus den docs ...

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

Wie bereits gesagt, erlaubt die JSON-Spezifikation (basierend auf ECMAScript 3) kein Nachkomma. ES> = 5 erlaubt dies, so dass Sie diese Notation auch in Pure JS verwenden können. Es wurde darüber diskutiert, und einige Parser did unterstützen es ( http://bolinfest.com/essays/json.html , http://whereswalden.com/2010/09/ 08/spidermonkey-json-change-trailing-commas-no-länger-akzeptiert/ ), aber es ist die spezielle Tatsache (wie auf http://json.org/ gezeigt), dass es sollten 't arbeiten in JSON. Das Ding sagte ...

Ich wundere mich, warum niemand darauf hingewiesen hat, dass Sie die Schleife tatsächlich bei der 0. Iteration aufteilen und führende-Kommata verwenden können, statt eines zu verwenden, um den Vergleichscode-Geruch und den tatsächlichen Performance-Overhead zu beseitigen 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 P-Code im C-Stil, der dem von OP vorgeschlagenen Code ähnelt):

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

Interessanterweise lassen sowohl C & C++ (und ich denke, C #, aber ich bin mir nicht sicher) das nachfolgende Komma ausdrücklich zulassen - aus genau dem angegebenen Grund: Es macht das programmatische Erstellen von Listen viel einfacher. Nicht sicher, warum JavaScript ihrem Beispiel nicht folgte. 

6
James Curran

Verwenden Sie JSON5. Verwenden Sie nicht JSON. 

  • Objekte und Arrays können nachfolgende Kommas enthalten
  • Objektschlüssel können nicht in Anführungszeichen gesetzt werden, wenn sie gültige Bezeichner sind
  • Zeichenfolgen können in Anführungszeichen gesetzt werden
  • Strings können über mehrere Zeilen aufgeteilt werden
  • Zahlen können hexadezimal sein (Basis 16)
  • Zahlen können mit einem (führenden oder nachgestellten) Dezimalpunkt beginnen oder enden.
  • Zahlen können Infinity und -Infinity enthalten.
  • Zahlen können mit einem expliziten Pluszeichen (+) beginnen.
  • Es sind sowohl Inline-Kommentare (einzeilig) als auch Blockkommentare (mehrzeilig) zulässig.

http://json5.org/

https://github.com/aseemk/json5

4
user619271

Entsprechend der Class JSONArray-Spezifikation :

  • Ein Extra (Komma) wird möglicherweise vor der schließenden Klammer angezeigt. 
  • 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,]

Es kann jedoch vorkommen, dass einige Parser die 7 als Elementanzahl (wie IE8, wie Daniel Earwicker darauf hinwies) anstelle der erwarteten 6 zurückgeben.


Bearbeitet:

Ich habe dieses JSON Validator gefunden, das einen JSON-String gegen RFC 4627 (Der Medientyp application/json für JavaScript Object Notation) und gegen die JavaScript-Sprachspezifikation überprüft. Tatsächlich wird hier ein Array mit einem nachgestellten Komma nur für JavaScript und nicht für die RFC 4627-Spezifikation als gültig betrachtet.

In der RFC 4627-Spezifikation wird jedoch Folgendes angegeben:

2.3. Arrays

Eine Array-Struktur wird in eckigen Klammern um Null herum dargestellt. oder mehr Werte (oder Elemente). Elemente werden durch Kommas getrennt.

array = begin-array [ value *( value-separator value ) ] 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), kann dies auf beide Arten verstanden werden. 

P.S. RFC 4627 ist kein Standard (wie explizit angegeben) und ist bereits durch RFC 7159 (ein vorgeschlagener Standard) veraltet. RFC 7159

2
Timoty Weis

Ich halte eine aktuelle Zählung und vergleiche sie mit einer Gesamtzählung. Wenn der aktuelle Zählerstand unter dem Gesamtwert liegt, wird das Komma angezeigt.

Funktioniert möglicherweise nicht, wenn Sie vor der Ausführung der JSON-Generierung keine Gesamtanzahl haben.

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

1
eddie

Aus meiner Erfahrung habe ich herausgefunden, dass verschiedene Browser mit nachgestellten Kommas in JSON unterschiedlich umgehen. 

Sowohl Firefox als auch Chrome können damit problemlos umgehen. Aber IE (alle Versionen) scheint zu brechen. Ich meine wirklich brechen und hör auf, den Rest des Skripts zu lesen. 

Unter Berücksichtigung dieser Tatsache und auch der Tatsache, dass es immer schön ist, kompatiblen Code zu schreiben, empfehle ich die zusätzliche Anstrengung, um sicherzustellen, dass kein nachträgliches Komma vorhanden ist. 

:) 

1
dnshio

Es ist nicht empfehlenswert, aber Sie können trotzdem etwas tun, um es zu analysieren.

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

0
feibing

Es gibt eine Möglichkeit, einen if-Zweig in der Schleife zu vermeiden. 

s.append("[ "); // there is a space after the left bracket
for (i = 0; i < 5; ++i) {
  s.appendF("\"%d\",", i); // always add comma
}
s.back() = ']'; // modify last comma (or the space) to right bracket
0
Zhang Boyang

Da eine for-Schleife verwendet wird, um ein Array oder eine ähnliche iterierbare Datenstruktur zu durchlaufen, können wir die Länge des Arrays wie gezeigt verwenden.

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

Mit datafile.txt mit

 Angela,Baker,2010-05-23
 Betty,Crockett,1990-12-07
 David,Done,2003-10-31
0

Normalerweise verwende ich das Array und füge nach jedem Eintrag in der Zeichenfolge ein Komma ein. Nach der Schleife lösche ich das letzte Komma wieder.

Vielleicht nicht der beste Weg, aber weniger teuer als jedes Mal zu prüfen, ob es das letzte Objekt in der Schleife ist, denke ich.

0
Nils

Mit Relaxed JSON können Sie nachfolgende Kommas haben, oder die Kommas einfach weglassen. Sie sind optional.

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

Schauen Sie sich die Relaxed JSON-Spezifikation an 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 Ihr Beispiel auch mit diesem Online-RJSON-Parser ausprobieren und sehen, dass es richtig analysiert wird.

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

0
Steven Spungin