Pouvez-vous utiliser une virgule dans un objet JSON?

lors de la génération manuelle d'un objet JSON ou d'un tableau, il est souvent plus facile de laisser une virgule Sur le dernier élément de l'objet ou du tableau. Par exemple, le code à la sortie d'un tableau de chaînes pourrait ressembler à (dans un C++ comme le pseudocode):

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

vous donnant une corde comme

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

est-ce permis?

330
demandé sur pkamb 2008-10-14 20:02:15

14 réponses

malheureusement la spécification de JSON ne permet pas une virgule de queue. Il ya quelques navigateurs qui permettront, mais généralement vous devez vous inquiéter de tous les navigateurs.

en général j'essaie de retourner le problème, et d'ajouter la virgule avant la valeur réelle, donc vous finissez avec le code qui ressemble à ceci:

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

cette ligne supplémentaire de code dans votre boucle for Est à peine cher...

une autre alternative que j'ai utilisée quand j'ai sorti une structure à JSON à partir d'un dictionnaire d'une certaine forme est de toujours ajouter une virgule après chaque entrée (comme vous le faites ci-dessus) et puis Ajouter une entrée factice à la fin qui n'a pas de virgule traînante (mais qui est juste paresseux; ->).

Ne fonctionne pas bien avec un tableau, malheureusement.

190
répondu brianb 2014-07-03 21:31:43

Pas de. La spécification JSON, comme maintenu à http://json.org , ne permet pas les guillemets. D'après ce que j'ai vu, certains analyseurs peuvent les autoriser silencieusement lors de la lecture d'une chaîne JSON, tandis que d'autres lanceront des erreurs. Pour l'interopérabilité, vous ne devriez pas l'inclure.

le code ci-dessus pourrait être restructuré, soit pour supprimer la virgule à la fin du tableau, soit pour ajouter la virgule avant les éléments, sautant celle de la première.

115
répondu Ben Combee 2016-05-16 01:12:50

Simple, Pas Cher, facile à lire, et fonctionne toujours indépendamment des spécifications.

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

la cession redondante à $ delim est un très petit prix à payer. Cela fonctionne aussi bien s'il n'y a pas de boucle explicite mais des fragments de code séparés.

96
répondu Overflowee 2014-11-05 19:08:05

les guillemets sont autorisés en JavaScript, mais ne fonctionnent pas en IE. Le JSON spec sans version de Douglas Crockford ne leur a pas permis, et parce que c'était sans Version, ça ne devait pas changer. La spécification ES5 JSON les a autorisés comme extension, mais le RFC 4627 de Crockford ne l'a pas fait, et ES5 est revenu à les rejeter. Firefox emboîté le pas. Internet Explorer est la raison pour laquelle nous ne pouvons pas avoir de belles choses.

17
répondu Tobu 2012-07-15 20:18:18

les codeurs PHP peuvent vouloir vérifier implode () . Cela prend un tableau le rejoint en utilisant une chaîne.

De la docs ...

$array = array('lastname', 'email', 'phone');
echo implode(",", $array); // lastname,email,phone
11
répondu Rik Heywood 2011-11-13 16:49:06

comme il a déjà été dit, JSON spec (basé sur ECMAScript 3) ne permet pas de virgule traînante. ES >= 5 l'autorise, de sorte que vous pouvez réellement utiliser cette notation dans JS pur. Il a été discuté sur, et certains parsers fait soutenir ( http://bolinfest.com/essays/json.html , http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas-no-longer-accepted / ), mais c'est le fait particulier (comme montré sur http://json.org / ) qu'il ne devrait pas travailler dans JSON. Cette chose dit...

... Je me demande pourquoi personne n'a fait remarquer que vous pouvez réellement diviser la boucle à la 0ème itération et utiliser menant virgule au lieu de suivre un pour se débarrasser de l'odeur du code de comparaison et de toute performance réelle au-dessus de la boucle, résultant en un code qui est en fait plus court, plus simple et plus rapide (en raison de l'absence de branchement/conditionnels dans le boucle) que les autres solutions proposées.

E. G. (dans un pseudo-code de style C similaire au code proposé par L'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("]");
9
répondu vaxquis 2016-12-23 21:41:39

il est intéressant de noter que c & c++ (et je pense que C#, mais je ne suis pas sûr) autorise spécifiquement la virgule de fin -- pour exactement la raison donnée: cela rend la génération de listes programmatiques beaucoup plus facile. Je ne sais pas pourquoi JavaScript n'a pas suivi leur exemple.

6
répondu James Curran 2008-10-14 17:29:36

utilisez JSON5. N'utilisez pas JSON.

  • les Objets et les tableaux peuvent avoir des virgules
  • les clés D'objet peuvent être ignorées si elles sont des identificateurs valides
  • Chaînes peuvent être seule cité
  • chaînes pouvant être divisées en plusieurs lignes
  • les nombres peuvent être hexadécimaux (base 16)
  • Les nombres
  • peuvent commencer ou se terminer par un point décimal (Premier ou deuxième).
  • Les nombres
  • peuvent inclure L'infini et-L'infini.
  • Les nombres
  • peuvent commencer par un signe plus (+) explicite.
  • les commentaires en ligne (ligne simple) et en bloc (ligne multiple) sont autorisés.

http://json5.org /

https://github.com/aseemk/json5

5
répondu user619271 2014-08-24 07:35:55

D'après mon expérience passée, j'ai découvert que différents navigateurs traitent différemment les virgules à la suite dans JSON.

Firefox et Chrome s'en chargent très bien. Mais IE (toutes les versions) semble casser. Arrête de lire le reste du script.

gardant cela à l'esprit, et aussi le fait qu'il est toujours agréable d'écrire du code conforme, je suggère de dépenser l'effort supplémentaire de s'assurer qu'il n'y a pas de virgule traînante.

:)

1
répondu dnshio 2011-10-14 15:59:24

je garde un compte courant et le compare à un compte total. Si le nombre est inférieur au nombre total, j'affiche la virgule.

peut ne pas fonctionner si vous n'avez pas un compte total avant d'exécuter la génération JSON.

encore une fois, si vous utilisez PHP 5.2.0 ou mieux, vous pouvez simplement formater votre réponse en utilisant l'API JSON intégrée.

1
répondu eddie 2012-07-11 11:29:16

selon la spécification de la classe JSONArray :

  • Un supplément d' , (virgule) peut apparaître juste avant le crochet fermant.
  • la valeur nulle sera insérée lorsqu'il y a , (virgule) elision.

donc, si je comprends bien, il devrait être permis d'écrire:

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

mais il pourrait arriver que certains parseurs retourneront les 7 comme compte d'article (comme IE8 comme L'a souligné Daniel Earwicker) au lieu des 6 attendus.


Édité:

j'ai trouvé ce JSON Validator qui valide une chaîne de caractères JSON contre RFC 4627 (le type application/json media pour la Notation D'objet JavaScript) et contre la spécification de langage JavaScript. En fait ici un tableau avec une virgule est considéré comme valide juste pour JavaScript et pas pour Spécification RFC 4627.

cependant, dans la spécification RFC 4627 il est indiqué que:

2.3. Tableaux

une structure de tableau est représentée par des crochets entourant zéro. ou plusieurs valeurs (ou les éléments). Les éléments sont séparés par des virgules.

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

pour moi, c'est encore un problème d'interprétation. Si vous écrivez que les éléments sont séparés par les virgules (sans mentionner les cas spéciaux, comme le dernier élément), peuvent être comprises dans les deux sens.

P. S. RFC 4627 n'est pas un standard (comme il est dit explicitement), et est déjà obsolited par la RFC 7159 (qui est un projet de norme) RFC 7159

1
répondu Timoty Weis 2015-04-29 06:09:21

je boucle habituellement sur le tableau et fixe une virgule après chaque entrée dans la chaîne. Après la boucle, j'efface à nouveau la dernière virgule.

peut-être pas la meilleure façon, mais moins cher que de vérifier à chaque fois si c'est le dernier objet dans la boucle je suppose.

0
répondu Nils 2008-12-11 10:06:49

ce n'est pas recommandé, mais vous pouvez encore faire quelque chose comme ça pour l'analyser.

jsonStr = '[0,1,2,3,4,5,]';
let data;
eval('data = ' + jsonStr);
console.log(data)
0
répondu feibing 2017-11-01 21:35:40

avec le JSON décontracté, vous pouvez avoir des virgules arrière, ou tout simplement laisser la virgule . Ils sont facultatifs.

il n'y a aucune raison que des virgules doivent être présentes pour analyser un document de type JSON.

jetez un oeil à la JSON spec détendue et vous verrez comment "bruyant" la JSON spec originale est. Beaucoup trop de virgules et de citations...

http://www.relaxedjson.org

vous pouvez également essayer votre exemple en utilisant cet analyseur rjson en ligne et le voir être analysé correctement.

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

0
répondu Steven Spungin 2018-02-08 15:58:59