Frage

Beim manuellen erzeugen eines JSON-Objekts oder-Arrays, ist es oft einfacher, hinterlassen Sie eine nachgestellte Komma auf das Letzte Element in dem Objekt oder ein array ist.Zum Beispiel, code für die Ausgabe aus einem array von Zeichenfolgen Aussehen könnte (in C++ wie pseudocode):

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

geben Sie eine Zeichenfolge wie

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

Ist das erlaubt?

War es hilfreich?

Lösung

Leider die JSON-Spezifikation kein Komma nicht gestattet. Es gibt ein paar Browser, die es ermöglichen werden, aber in der Regel müssen Sie über alle Browser sorgen.

Im Allgemeinen versuche ich, das Problem umdrehen, und das Komma vor dem eigentlichen Wert hinzufügen, so dass Sie mit dem Code am Ende, das wie folgt 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("]");

Das gewisse Extra eine Zeile Code in Ihre for-Schleife ist kaum teuer ...

Eine weitere Alternative, die ich verwendet habe, wenn die Ausgabe eine Struktur zu JSON aus einem Wörterbuch irgendeiner Form ein Komma nach jeder Eingabe immer anhängen (wie Sie oben tun) und dann einen Dummy-Eintrag am Ende hinzufügen, die nicht hat Hinter Komma (aber das ist nur faul; ->).

funktioniert nicht gut mit einer Reihe leider.

Andere Tipps

Nein. Die JSON-Spezifikation, wie erhalten bei http://json.org , erlaubt keine Kommas Hinter. Von dem, was ich gesehen habe, können einige Parser sie leise erlauben, wenn ein JSON-String zu lesen, während andere Fehler werfen. Für die Interoperabilität sollten Sie umfassen es nicht.

Der obige Code umstrukturiert werden könnte, entweder das folgende Komma zu entfernen, wenn das Array Terminator Hinzufügen oder das Komma vor Artikeln hinzufügen, das Überspringen, dass für die ersten.

Einfach, Billig, leicht zu Lesen, und funktioniert immer, unabhängig von den Spezifikationen.

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

Die redundante Zuordnung zu $delim ist ein sehr kleiner Preis zu bezahlen.Auch funktioniert genauso gut, wenn es keine explizite Schleife, aber eigenen code-Fragmente.

Nachgestellte Kommas sind in JavaScript erlaubt, aber funktionieren nicht im Internet Explorer. Douglas Crockford versions JSON spec habe sie nicht erlauben, und weil es versions war dies nicht ändern sollte. Die ES5 JSON-Spezifikation erlaubt sie als eine Erweiterung, sondern Crockford RFC 4627 nicht, und ES5 zurückgekehrt sie nicht anzuerkennen. Firefox gefolgt. Internet Explorer ist, warum wir nette Sachen nicht haben können.

Wie es bereits gesagt, JSON-Spezifikation (basierend auf ECMAScript 3) erlaubt kein Komma Hinter. ES> = 5 erlaubt es, so dass Sie tatsächlich diese Schreibweise in reiner JS verwenden können. Es wurde etwa argumentiert, 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 Spezifikation der Tat (wie gezeigt < a href = "http://json.org/" rel = "noreferrer"> http://json.org/ ), dass es sollte nicht Arbeit in JSON. Das Ding hat gesagt ...

... Ich frage mich, warum niemand darauf hingewiesen, dass Sie tatsächlich die Schleife bei der 0. Iteration aufspalten und mit führenden Komma anstelle einer Hinter dem Vergleich Codegeruches loszuwerden und jede tatsächliche Performance-Overhead in der Schleife, in einem Code führt, die tatsächlich kürzer, einfacher und schneller (da keine Verzweigung / conditionals in der Schleife) sind als andere Lösungen vorgeschlagen.

z. (In einem C-Stil Pseudo-Code ähnlich wie vorgeschlagen Code des OP):

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-Programmierer möchten überprüfen, implodieren () . Dies nimmt ein Array es reiht sich in eine Zeichenfolge zu verbrauchen.

Von der docs ...

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

Interessanterweise sowohl C & C ++ (und ich denke, C #, aber ich bin mir nicht sicher), die speziell das folgende Komma erlauben - aus genau dem Grund gegeben: Es macht programmaticly Listen viel einfacher zu erzeugen. Nicht sicher, warum JavaScript nicht ihrem Beispiel folgen.

Verwenden JSON5.Verwenden Sie nicht JSON.

  • Objekte und arrays können nachgestellte Kommas
  • Objekt-Schlüssel können nicht börsennotierten wenn Sie sind gültige Bezeichner
  • Zeichenfolgen können in einfache Anführungszeichen eingeschlossene
  • Strings aufgeteilt werden können, die über mehrere Zeilen
  • Zahlen hexadezimal (base 16)
  • Zahlen können am Anfang oder am Ende (führende oder nachgestellte) decimal point.
  • Zahlen einschließen können, Infinity und -Infinity.
  • Zahlen können beginnen mit einem deutlichen plus-Zeichen ( + ).
  • Inline (single-Linie) und block (multi-line) Kommentare sind erlaubt.

http://json5.org/

https://github.com/aseemk/json5

Nach dem Klasse JSONArray Spezifikation :

  • Ein zusätzliche, (Komma) kann kurz vor der schließenden Klammer erscheinen.
  • wird der Nullwert eingefügt werden, wenn es, (Komma) elision.

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 Elementanzahl (wie IE8 als Daniel Earwicker wies darauf hin) Rückkehr statt der erwarteten 6.


Editiert:

Ich fand dieses JSON Validator , die einen JSON-String gegen RFC 4627 (der application / json Medientyp für JavaScript Object Notation) und gegen die JavaScript-Sprachspezifikation. Eigentlich hier ein Array mit einem Komma wird als gültig betrachtet nur für JavaScript und nicht für die RFC-4627-Spezifikation.

Doch in den RFC 4627-Spezifikation angegeben wird, dass:

  

2.3. Arrays

     

Eine Array-Struktur wird als eckige Klammern dargestellt Null umgebenden   oder mehr Werte (oder Elemente). Die Elemente werden durch Komma getrennt.

array = begin-array [ value *( value-separator value ) ] end-array

Für mich ist das wieder ein Interpretationsproblem. Wenn Sie schreiben, dass Elemente werden durch Komma getrennt (ohne etwas über spezielle Fälle besagen, wie das letzte Element), könnte es in beiden Richtungen verstanden werden.

P. S. RFC 4627 ist kein Standard (wie ausdrücklich angegeben) und wird bereits obsolited von RFC 7159 (das ist ein vorgeschlagener Standard)

Aus meiner bisherigen Erfahrung fand ich, dass verschiedener Browser behandelt anders Kommas in JSON Hinter.

Firefox und Chrome behandelt sie gut. Aber IE (alle Versionen) scheint zu brechen. Ich meine wirklich brechen und beenden Sie den Rest des Skripts zu lesen.

das Halten im Verstand, und auch die Tatsache, dass es immer schön ist konformen Code zu schreiben, schlage ich vor, die Ausgaben den zusätzlichen Aufwand, dafür zu sorgen, dass es kein Komma.

:)

Ich halte eine aktuelle Zählung und vergleichen Sie es mit einem Umfang von insgesamt. Wenn die aktuelle Anzahl kleiner als die Gesamtzahl ist, zeige ich das Komma.

Kann nicht funktionieren, wenn Sie nicht über eine Gesamtzählung vor der Ausführung der JSON Generation haben.

Dann wieder, wenn Ihr mit PHP 5.2.0 oder besser, können Sie einfach formatieren Sie Ihre Antwort die JSON-API integriert.

ich in der Regel eine Schleife über das Array und ein Komma nach jedem Eintrag in der Zeichenfolge anhängen. Ich lösche das letzte Komma nach der Schleife wieder.

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

Es wird nicht empfohlen, aber man kann immer noch etwas tun, es zu analysieren.

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

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

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

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 enthält,

 Angela,Baker,2010-05-23
 Betty,Crockett,1990-12-07
 David,Done,2003-10-31
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top