Atunci când manual generând un obiect JSON sau matrice, l's de multe ori mai ușor să lase o virgulă la final, pe ultimul element din obiect sau un array. De exemplu, codul de ieșire dintr-o matrice de siruri de caractere ar putea arata ca (în C++ ca pseudocod):
s.append("[");
for (i = 0; i < 5; ++i) {
s.appendF("\"%d\",", i);
}
s.append("]");
oferindu-vă un șir de genul
[0,1,2,3,4,5,]
Este permis acest lucru?
Din păcate caietul de sarcini JSON nu permite o virgulă la final. Există câteva browsere care va permite acest lucru, dar, în general, aveți nevoie să vă faceți griji despre toate browserele.
În general încerc transforma problema în jurul valorii de, și se adaugă virgulă înainte de valoarea reală, astfel încât să sfârșesc cu codul care arata ca aceasta:
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("]");
Asta plus o linie de cod în buclă este prea scump...
O altă alternativă I'am folosit atunci când ieșire o structură JSON de la un dicționar de o anumită formă este întotdeauna adăuga o virgulă după fiecare intrare (ca mai sus) și apoi se adaugă un manechin de intrare la final că nu a trailing comma (dar asta este doar leneș ;->).
Nu't lucra bine cu o gamă din păcate.
Nr. JSON spec, ca menținută la http://json.org, nu permite la final virgule. Din ceea ce am'am văzut, unele interpretoare poate în tăcere să le permită, atunci când citesc un șir JSON, în timp ce alții vor arunca erori. Pentru interoperabilitate, nu ar trebui't cuprinde.
Codul de mai sus ar putea fi restructurate, fie pentru a elimina virgulă la final, atunci când adăugarea de matrice terminator sau pentru a adăuga o virgulă înainte de obiecte, sărind peste faptul că, pentru prima dată.
Simplu, ieftin, ușor de citit, și funcționează întotdeauna, indiferent de specificatii.
$delimiter = '';
for .... {
print $delimiter.$whatever
$delimiter = ',';
}
Concediați de atribuire a $delim este un preț mic de plătit. De asemenea, funcționează la fel de bine dacă nu există nici explicit buclă dar separate de fragmente de cod.
La final virgule sunt permise în JavaScript, dar nu't lucra în IE. Douglas Crockford's versionless JSON spec nu't le permite, și pentru că a fost versionless asta era't ar trebui să se schimbe. La ES5 JSON spec le-a permis, ca o prelungire, dar Crockford's RFC 4627 n't, și ES5 revenit la interzicându-le. Firefox i-a urmat exemplul. Internet Explorer este ce putem't avea lucruri frumoase.
Ca's a fost deja spus, JSON spec (bazat pe ECMAScript 3) nu't permite trailing comma. ES >= 5 permite, astfel încât să puteți folosi de fapt, că în notație pur JS. L's-au certat, iar unele interpretoare v suport it (http://bolinfest.com/essays/json.html, http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas-no-longer-accepted/), dar's spec fapt (așa cum se arată pe http://json.org/) care a ar't muncă în JSON. Chestia asta a spus...
... Am'm întrebam de ce nimeni nu a subliniat că puteți împărți, de fapt bucla de la 0th repetare și de a folosi de conducere virgulă în loc de sfârșit o să scape de cod comparație miros și nici performanța reală aeriene în buclă, rezultând într-un cod care's, de fapt, mai scurte, mai simple și mai repede (din cauza nr de ramificare/condiționale în buclă) decât alte soluții propuse.
E. g. (într-un C-stil pseudocod similare la OP's a propus cod):
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("]");
Programatorii PHP poate doriți să verificați implode(). Aceasta are o serie se alătură folosind un șir de caractere.
De documente...
$array = array('lastname', 'email', 'phone');
echo implode(",", $array); // lastname,email,phone
Interesant, ambele C & C++ (și cred C#, dar nu'm nu sunt sigur) permite în mod specific trailing comma-pentru exact motivul dat: Se face programmaticly generarea de liste mult mai ușor. Nu sunt sigur de ce JavaScript n't s-o urmeze.
Utilizarea JSON5. Don't folosi JSON.
Conform Clasa JSONArray caietul de sarcini:
Deci, după cum am înțeles, ar trebui să fie permis să scrie:
[0,1,2,3,4,5,]
Dar s-ar putea întâmpla ca unele interpretoare va reveni la 7 ca numar articol (cum ar fi IE8 ca Daniel Earwicker subliniat) în loc de așteptat 6.
Editat:
Am găsit asta JSON Validator care validează un șir JSON împotriva RFC 4627 (application/json tip de suport pentru JavaScript Object Notation) și împotriva limbajului JavaScript caietul de sarcini. De fapt aici o matrice cu un trailing comma este considerat valabil doar pentru JavaScript și nu pentru RFC 4627 caietul de sarcini.
Cu toate acestea, în RFC 4627 caietul de sarcini se precizează că:
2.3. Tablouri
O matrice structura este reprezentat ca paranteze pătrate din jur zero sau mai multe valori (sau elemente). Elementele sunt separate prin virgule.
matrice = a începe-matrice [ valoare *( valoare-separator de valoare ) ] end-matrice
Pentru mine acest lucru este din nou o problemă de interpretare. Dacă scrie că Elemente sunt separate prin virgule (fără a afirma ceva despre cazuri speciale, cum ar fi ultimul element), ar putea fi înțeleasă în ambele sensuri.
P. S. RFC 4627 e't un standard (ca în mod explicit), și este deja obsolited prin RFC 7159 (care este un standard propus) RFC 7159
Din experiența mea, am constatat că diferite browsere afacere cu final virgule în JSON diferit.
Atât Firefox și Chrome ocupă foarte bine. Dar IE (Toate versiunile) pare a se rupe. Adică într-adevăr rupe si nu mai citesc restul de script-ul.
Păstrarea în minte, și, de asemenea, faptul că-l's întotdeauna frumos pentru a scrie conforme cu cod, am sugera cheltuieli efort suplimentar de a face sigur că nu's nici o virgulă la final.
:)
Cu Relaxat JSON, puteți avea sfârșit virgule, sau pur și simplu lăsați virgule out. Acestea sunt opționale.
Nu există nici un motiv, la toate virgulele trebuie să fie prezent pentru a analiza un JSON-ca document.
Aruncati o privire la Relaxat JSON spec și veți vedea cât de 'zgomotos' original JSON spec. Prea multe virgule și citate...
De asemenea, puteți încerca de exemplu, folosind acest on-line RJSON parser și vadă obține analizat corect.
http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D
I a păstra un curent conta și să o comparăm cu numărul total. Dacă numărul curent este mai mic decât numărul total, am afișa virgula.
Nu pot lucra dacă nu't avea un număr total înainte de executarea JSON generație.
Apoi, din nou, în cazul în care dumneavoastră folosind PHP 5.2.0 sau mai bine, puteți doar în format răspunsul dumneavoastră folosind JSON API construit în.
Deoarece o pentru buclă este folosit pentru a repeta peste o matrice, sau similare iterable structura de date, putem folosi lungimea de matrice după cum se arată,
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
Cu datafile.txt conțin,
Angela,Baker,2010-05-23
Betty,Crockett,1990-12-07
David,Done,2003-10-31
Există o posibilă modalitate de a evita-o dacă-filiala din bucla.
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
Eu de obicei bucla peste matrice și atașați o virgulă după fiecare intrare în șir. După bucla am șterge ultima virgula din nou.
Poate nu cel mai bun mod, dar mai puțin costisitoare decât verifică de fiecare dată dacă-l's ultimul obiect în buclă cred.