passaggio - scorrere un json




Puoi usare una virgola finale in un oggetto JSON? (10)

Quando si genera manualmente un oggetto o un array JSON, è spesso più facile lasciare una virgola finale sull'ultimo oggetto nell'array o nell'oggetto. Ad esempio, il codice per l'output da una matrice di stringhe potrebbe essere simile (in un C ++ come pseudocodice):

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

dandoti una stringa come

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

È permesso?


È interessante notare che sia C & C ++ (e penso che C #, ma non ne sono sicuro) in particolare consentono la virgola finale - per esattamente la ragione fornita: rende molto più facile la generazione di liste programmatiche. Non sono sicuro del motivo per cui JavaScript non ha seguito il loro esempio.


Come è già stato detto, la specifica JSON (basata su ECMAScript 3) non consente la virgola finale. ES> = 5 lo consente, quindi puoi effettivamente usare quella notazione in puro JS. È stato discusso e alcuni parser l' hanno supportato ( http://bolinfest.com/essays/json.html , Firefox ), ma è il fatto (come mostrato su http://json.org/ ) che non dovrebbe funzionare in JSON. Quella cosa ha detto ...

... Mi chiedo perché nessuno ha sottolineato che è possibile dividere il ciclo a 0a iterazione e utilizzare la virgola principale invece di una successiva per sbarazzarsi dell'odore del codice di confronto e dell'overhead delle prestazioni effettive nel ciclo, con conseguente un codice che è in realtà più breve, più semplice e più veloce (a causa dell'assenza di ramificazioni / condizionali nel loop) rispetto ad altre soluzioni proposte.

Ad esempio (in uno pseudocodice in stile C simile al codice proposto dall'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("]");

Dalla mia esperienza passata, ho scoperto che diversi browser gestiscono le virgole finali in JSON in modo diverso.

Sia Firefox che Chrome lo gestiscono bene. Ma IE (Tutte le versioni) sembra rompere. Intendo davvero rompere e smettere di leggere il resto della sceneggiatura.

Tenendo presente ciò, e anche il fatto che sia sempre piacevole scrivere codice conforme, suggerisco di dedicare uno sforzo ulteriore per assicurarmi che non ci sia una virgola finale.

:)


Esiste un modo possibile per evitare un ramo if nel loop.

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

In base alla specifica Class JSONArray :

  • Un extra, (virgola) può apparire appena prima della parentesi di chiusura.
  • Il valore nullo verrà inserito quando è presente, (virgola) elisione.

Quindi, a quanto ho capito, dovrebbe essere permesso di scrivere:

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

Ma potrebbe succedere che alcuni parser restituiscano il 7 come numero di elementi (come IE8 come indicato da Daniel Earwicker) invece del previsto 6.

Modificato:

Ho trovato questo JSON Validator che convalida una stringa JSON contro RFC 4627 (Il tipo di applicazione / json media per JavaScript Object Notation) e contro le specifiche del linguaggio JavaScript. In realtà qui un array con una virgola finale è considerato valido solo per JavaScript e non per la specifica RFC 4627.

Tuttavia, nella specifica RFC 4627 si afferma che:

2.3. Array

Una struttura di array è rappresentata da parentesi quadre che circondano zero o più valori (o elementi). Gli elementi sono separati da virgole.

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

Per me questo è di nuovo un problema di interpretazione. Se scrivi che gli Elementi sono separati da virgole (senza indicare qualcosa sui casi speciali, come l'ultimo elemento), potrebbe essere compreso in entrambi i modi.

PS RFC 4627 non è uno standard (come esplicitamente dichiarato) ed è già obsoleto da RFC 7159 (che è uno standard proposto) RFC 7159


Le virgole finali sono consentite in JavaScript, ma non funzionano in IE. Le specifiche JSON senza versione di Douglas Crockford non le permettevano, e poiché non era in versione, questo non doveva cambiare. La specifica ES5 JSON li ha consentiti come estensione, ma la RFC 4627 di Crockford no, e ES5 è tornata a non autorizzarli. Firefox seguito l'esempio. Internet Explorer è il motivo per cui non possiamo avere cose carine.


Non è raccomandato, ma puoi comunque fare qualcosa del genere per analizzarlo.

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


Semplice, economico, facile da leggere e funziona sempre indipendentemente dalle specifiche.

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

L'assegnazione ridondante a $ delim è un prezzo molto basso da pagare. Funziona anche se non esiste un ciclo esplicito ma frammenti di codice separati.


Solitamente eseguo il ciclo sull'array e allego una virgola dopo ogni voce nella stringa. Dopo il ciclo, elimino nuovamente l'ultima virgola.

Forse non è il modo migliore, ma è meno costoso che controllare ogni volta se è l'ultimo oggetto nel ciclo, immagino.


Tengo un conteggio corrente e lo confronta con un conteggio totale. Se il conteggio corrente è inferiore al conteggio totale, visualizzo la virgola.

Potrebbe non funzionare se non si dispone di un conteggio totale prima di eseguire la generazione JSON.

Inoltre, se utilizzi PHP 5.2.0 o versione successiva, puoi semplicemente formattare la risposta utilizzando l'API JSON integrata.





delimiter