Beim manuellen Generieren eines JSON-Objekts oder -Arrays ist es häufig einfacher, ein abschließendes Komma für das letzte Element im Objekt oder Array zu hinterlassen. Beispielsweise könnte Code, der aus einem Array von Zeichenfolgen 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("]");
Geben Sie eine Zeichenfolge wie
[0,1,2,3,4,5,]
Ist das erlaubt?
alert([1, 2, 3, ].length)
"4" angezeigt wird.Antworten:
Leider lässt die JSON-Spezifikation kein nachfolgendes Komma zu. 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 Sie am Ende Code erhalten, der folgendermaßen aussieht:
Diese zusätzliche Codezeile 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 ein Komma anzuhängen (wie oben beschrieben) und am Ende einen Dummy-Eintrag hinzuzufügen, der kein nachfolgendes Komma enthält (aber das ist nur faul; ->).
Funktioniert leider nicht gut mit einem Array.
quelle
if
s, nur um dieses dumme kleine Komma zu vermeiden. Informationen zum Preis von YMMV finden Sie beispielsweise in jsfiddle.net/oriadam/mywL9384. Erläuterung : Ihre Lösung ist großartig. Ich hasse nur Spezifikationen, die ein nachfolgendes Komma verbieten.Nein. Die JSON-Spezifikation, wie sie unter http://json.org gepflegt wird , erlaubt keine nachgestellten Kommas. Nach allem, was ich gesehen habe, können einige Parser sie beim Lesen einer JSON-Zeichenfolge stillschweigend zulassen, während andere Fehler auslösen. Aus Gründen der Interoperabilität sollten Sie es nicht einschließen.
Der obige Code könnte umstrukturiert werden, entweder um das nachfolgende Komma beim Hinzufügen des Array-Terminators zu entfernen oder um das Komma vor Elementen hinzuzufügen, wobei das Komma für das erste übersprungen wird.
quelle
Einfach, billig, leicht zu lesen und funktioniert immer unabhängig von den Spezifikationen.
Die redundante Zuordnung zu $ delim ist ein sehr geringer Preis. Funktioniert auch genauso gut, wenn es keine explizite Schleife gibt, sondern separate Codefragmente.
quelle
if
ist leichter zu erfassen. Aber danke fürs Teilen.for(let ..., sep=""; ... ; sep=",") { ...
Nachgestellte Kommas sind in JavaScript zulässig, funktionieren jedoch nicht im IE. Douglas Crockfords versionlose JSON-Spezifikation erlaubte es ihnen nicht, und da es versionlos war, sollte sich dies nicht ändern. Die ES5-JSON-Spezifikation erlaubte sie als Erweiterung, Crockfords RFC 4627 jedoch nicht, und ES5 ließ sie nicht mehr zu. Firefox folgte dem Beispiel. Internet Explorer ist der Grund, warum wir keine schönen Dinge haben können.
quelle
Wie bereits erwähnt, erlaubt die JSON-Spezifikation (basierend auf ECMAScript 3) kein nachfolgendes Komma. ES> = 5 erlaubt es, so dass Sie diese Notation tatsächlich in reinem JS verwenden können. Es wurde darüber gestritten und einige Parser haben es unterstützt ( http://bolinfest.com/essays/json.html , http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas- nicht mehr akzeptiert / ), aber es ist die spezielle Tatsache (wie auf http://json.org/ gezeigt ), dass es in JSON nicht funktionieren sollte . Das Ding sagte ...
... Ich frage mich, warum niemand darauf hingewiesen hat, dass Sie die Schleife bei der 0. Iteration tatsächlich teilen und ein führendes Komma verwenden können, anstatt ein nachfolgendes Komma zu verwenden, um den Geruch des Vergleichscodes und den tatsächlichen Leistungsaufwand in der Schleife zu beseitigen Ein Code, der tatsächlich kürzer, einfacher und schneller ist (da keine Verzweigungen / Bedingungen in der Schleife vorhanden sind) als andere vorgeschlagene Lösungen.
ZB (in einem Pseudocode im C-Stil ähnlich dem von OP vorgeschlagenen Code):
quelle
PHP-Codierer möchten möglicherweise implode () auschecken . Dies erfordert, dass ein Array es mithilfe einer Zeichenfolge zusammenfügt.
Aus den Dokumenten ...
quelle
Interessanterweise erlauben sowohl C als auch C ++ (und ich denke, C #, aber ich bin nicht sicher) speziell das nachfolgende Komma - genau aus dem angegebenen Grund: Es erleichtert das programmgesteuerte Generieren von Listen erheblich. Ich bin mir nicht sicher, warum JavaScript ihrem Beispiel nicht gefolgt ist.
quelle
Verwenden Sie JSON5. Verwenden Sie kein JSON.
http://json5.org/
https://github.com/aseemk/json5
quelle
Es gibt eine Möglichkeit, eine if-Verzweigung in der Schleife zu vermeiden.
quelle
Gemäß der Class JSONArray-Spezifikation :
So wie ich es verstehe, sollte es erlaubt sein zu schreiben:
Es kann jedoch vorkommen, dass einige Parser die 7 als Anzahl der Elemente (wie IE8, wie Daniel Earwicker hervorhob) anstelle der erwarteten 6 zurückgeben.
Bearbeitet:
Ich habe diesen JSON-Validator gefunden , der eine JSON-Zeichenfolge gegen RFC 4627 validiert (den Medientyp application / json für die JavaScript-Objektnotation) und gegen die JavaScript-Sprachspezifikation . 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 angesehen.
In der RFC 4627-Spezifikation wird jedoch Folgendes angegeben:
Für mich ist dies wieder ein Interpretationsproblem. Wenn Sie schreiben, dass Elemente durch Kommas getrennt sind (ohne etwas über Sonderfälle wie das letzte Element anzugeben), kann dies auf beide Arten verstanden werden.
PS RFC 4627 ist kein Standard (wie ausdrücklich angegeben) und wird bereits von RFC 7159 (einem vorgeschlagenen Standard) RFC 7159 überholt
quelle
value-separator
ohne einvalue
Recht daneben zu haben. Auch der Text ist sehr spezifisch. "Wertetrennung" kann nur angewendet werden, wenn mehrere Werte vorhanden sind. Wenn Sie also zwei Werte nebeneinander haben, werden diese durch ein Komma getrennt. Wenn Sie einen Wert haben (oder nur den Wert am Ende betrachten), gibt es keine Trennung, daher kein Komma.Aufgrund meiner bisherigen Erfahrungen habe ich festgestellt, dass verschiedene Browser mit nachgestellten Kommas in JSON unterschiedlich umgehen.
Sowohl Firefox als auch Chrome handhaben das einwandfrei. Aber IE (alle Versionen) scheint zu brechen. Ich meine wirklich brechen und aufhören, den Rest des Drehbuchs zu lesen.
In Anbetracht dessen und der Tatsache, dass es immer schön ist, kompatiblen Code zu schreiben, empfehle ich, den zusätzlichen Aufwand zu betreiben, um sicherzustellen, dass kein nachgestelltes Komma vorhanden ist.
:) :)
quelle
Ich behalte eine aktuelle Zählung und vergleiche sie mit einer Gesamtzählung. Wenn die aktuelle Anzahl kleiner als die Gesamtzahl ist, zeige ich das Komma an.
Funktioniert möglicherweise nicht, wenn Sie vor dem Ausführen der JSON-Generierung keine Gesamtzahl haben.
Wenn Sie PHP 5.2.0 oder besser verwenden, können Sie Ihre Antwort einfach mit der integrierten JSON-API formatieren.
quelle
Mit Relaxed JSON können Sie nachgestellte Kommas verwenden oder die Kommas einfach weglassen . Sie sind optional.
Es gibt überhaupt keinen Grund, warum Kommas vorhanden sein müssen, um ein JSON-ähnliches Dokument zu analysieren.
Werfen Sie einen Blick auf die Relaxed JSON-Spezifikation und Sie werden sehen, wie laut die ursprüngliche JSON-Spezifikation ist. Viel zu viele Kommas und Anführungszeichen ...
http://www.relaxedjson.org
Sie können Ihr Beispiel auch mit diesem Online-RJSON-Parser ausprobieren und sehen, ob es korrekt analysiert wird.
http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D
quelle
json object
VerwendungJSON.parse
oder von einer Bibliothek unter Verwendung analysiert werdenRJSON.parse
. Ich würde Ihnen zustimmen, wenn die Quelle ein Objekt wäre, aber das ist hier nicht der Fall. Ich sehe nicht, wo in der Frage überhaupt erwähnt wirddownstream
, dass ein Objekt oder eine Zeichenfolge verbraucht wird.Normalerweise durchlaufe ich das Array und füge nach jedem Eintrag in der Zeichenfolge ein Komma hinzu. Nach der Schleife lösche ich das letzte Komma wieder.
Vielleicht nicht der beste Weg, aber billiger als jedes Mal zu überprüfen, ob es das letzte Objekt in der Schleife ist, denke ich.
quelle
Es wird nicht empfohlen, aber Sie können trotzdem so etwas tun, um es zu analysieren.
quelle
Da eine for-Schleife verwendet wird, um über ein Array oder eine ähnliche iterierbare Datenstruktur zu iterieren, können wir die Länge des Arrays wie gezeigt verwenden:
Mit datafile.txt enthält,
quelle
Wie gesagt ist es nicht erlaubt. In JavaScript ist dies jedoch:
(funktioniert gut in Firefox, Chrome, Edge, IE11 und ohne die Erlaubnis in IE9, 8, 7, 5)
quelle