Question

Lorsque vous générez manuellement un objet ou un tableau JSON, il est souvent plus facile de laisser une virgule de fin sur le dernier élément de l'objet ou du tableau. Par exemple, le code à afficher à partir d'un tableau de chaînes pourrait ressembler (dans un C ++, à un pseudocode):

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

vous donnant une chaîne comme

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

Est-ce autorisé?

Était-ce utile?

La solution

Malheureusement, la spécification JSON n'autorise pas les virgules de fin. Quelques navigateurs le permettent, mais vous devez généralement vous soucier de tous les navigateurs.

En général, j'essaie de résoudre le problème et d'ajouter la virgule avant la valeur réelle. Vous obtenez donc un 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 de code supplémentaire dans votre boucle for n’est pas chère ...

Une autre alternative que j’ai utilisée lors de la sortie d’une structure vers JSON à partir d’un dictionnaire de quelque forme que ce soit consiste à toujours ajouter une virgule après chaque entrée (comme vous le faites ci-dessus), puis à ajouter une entrée fictive à la fin qui n’a pas de fin. virgule (mais c'est simplement paresseux; - >).

Malheureusement, cela ne fonctionne pas bien avec un tableau.

Autres conseils

Non. La spécification JSON, telle qu'elle est gérée à l'adresse http://json.org , n'autorise pas les virgules de fin. D'après ce que j'ai vu, certains analyseurs peuvent l'autoriser en silence lors de la lecture d'une chaîne JSON, tandis que d'autres génèrent des erreurs. Pour l’interopérabilité, vous ne devez pas l’inclure.

Le code ci-dessus pourrait être restructuré, soit pour supprimer la virgule de fin lors de l'ajout du terminateur de tableau, soit pour ajouter la virgule avant les éléments, en ignorant celui du premier.

Simple, bon marché, facile à lire et fonctionne toujours quelles que soient les spécifications.

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

L’affectation redondante à $ delim est un très petit prix à payer. Cela fonctionne également aussi bien s’il n’ya pas de boucle explicite mais de fragments de code séparés.

Les virgules de fin sont autorisés en JavaScript, mais ne fonctionnent pas dans IE. Les spécifications JSON sans version de Douglas Crockford ne les autorisaient pas, et comme elles étaient sans version, cela n'était pas censé changer. La spécification JSON ES5 les autorisait comme une extension, mais la RFC 4627 de Crockford ne l'a pas été et l'ES5 a été annulé. de les refuser. Firefox a fait de même. Internet Explorer est la raison pour laquelle nous ne pouvons pas avoir de belles choses.

Comme cela a déjà été dit, les spécifications JSON (basées sur ECMAScript 3) n'autorisent pas les virgules de fin. ES> = 5 le permet, vous pouvez donc utiliser cette notation en JS pur. On en a parlé, et certains analyseurs l'ont soutenu ( 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 spécifique (comme indiqué sur < un href = "http://json.org/" rel = "noreferrer"> http://json.org/ ) qu'il ne devrait pas fonctionner en JSON. Cette chose a dit ...

... je me demande pourquoi personne n'a indiqué qu'il est possible de scinder la boucle à la 0e itération et d'utiliser la virgule au lieu de au lieu de la terminer pour vous débarrasser de l'odeur du code de comparaison et toute surcharge de performance réelle dans la boucle, ce qui donne un code plus court, plus simple et plus rapide (en l'absence de branchement / conditionnel dans la boucle) que les autres solutions proposées.

E.g. (dans un pseudocode de style C similaire au code proposé par 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("]");

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

Extrait du docs ...

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

Fait intéressant, les deux C & amp; C ++ (et je pense que C #, mais je ne suis pas sûr) permet spécifiquement la virgule de fin - pour exactement la raison donnée: cela facilite beaucoup la génération par programmation de listes. Vous ne savez pas pourquoi JavaScript n'a pas suivi leur exemple.

Utilisez JSON5. N'utilisez pas JSON.

  • Les objets et les tableaux peuvent avoir des virgules
  • Les clés d'objet peuvent ne pas être citées si elles sont des identificateurs valides
  • Les chaînes peuvent être entre guillemets simples
  • Les chaînes peuvent être fractionnées sur plusieurs lignes
  • Les nombres peuvent être hexadécimaux (base 16)
  • Les nombres peuvent commencer ou se terminer par un point décimal (en début ou en fin de chaîne).
  • Les nombres peuvent inclure l'infini et l'infini.
  • Les nombres peuvent commencer par un signe plus (+) explicite.
  • Les commentaires en ligne (sur une seule ligne) et les commentaires sur les blocs (sur plusieurs lignes) sont autorisés.

http://json5.org/

https://github.com/aseemk/json5

Selon la spécification JSONArray de classe :

  • Un extra (virgule) peut apparaître juste avant le crochet de fermeture.
  • La valeur null sera insérée s’il existe une élision (virgule).

Donc, si je comprends bien, il devrait être autorisé à écrire:

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

Mais il se peut que certains analyseurs syntaxiques renvoient le nombre d’articles 7 comme le nombre d’articles (comme IE8, comme l'a souligné Daniel Earwicker) au lieu du 6 attendu.

Modifié:

J'ai trouvé ce Validateur JSON qui valide une chaîne JSON contre RFC 4627 (type de support application / json pour la notation d'objet JavaScript) et par rapport à la spécification du langage JavaScript. En réalité, un tableau avec une virgule est considéré comme valide uniquement pour JavaScript et non pour la 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 é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 des virgules (sans préciser les cas particuliers, comme le dernier élément), vous pouvez le comprendre de deux manières.

P.S. La RFC 4627 n'est pas une norme (comme explicitement indiqué) et est déjà obsolète par la RFC 7159 (qui est une norme proposée) RFC 7159

D'après mon expérience, j'ai constaté que différents navigateurs traitent les virgules de fin en JSON différemment.

Firefox et Chrome le traitent très bien. Mais IE (toutes les versions) semble casser. Je veux dire vraiment casser et arrêter de lire le reste du script.

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

:)

Je garde un compte actuel et le compare à un compte total. Si le nombre actuel est inférieur au nombre total, j’affiche la virgule.

Peut ne pas fonctionner si vous ne disposez pas d'un nombre total avant d'exécuter la génération JSON.

Encore une fois, si vous utilisez PHP 5.2.0 ou une version ultérieure, vous pouvez simplement formater votre réponse à l'aide de l'API JSON intégrée.

Grâce à JSON relaxé, vous pouvez avoir des virgules de fin, ou tout simplement les laisser de côté . Ils sont facultatifs.

Il n’existe aucune virgule nécessaire pour analyser un document de type JSON.

Jetez un coup d’œil à la spécification JSON décontractée et vous verrez à quel point la spécification JSON originale est "bruyante". Beaucoup trop de virgules et de guillemets ...

http://www.relaxedjson.org

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

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

En général, je boucle sur le tableau et attache une virgule après chaque entrée de la chaîne. Après la boucle, je supprime à nouveau la dernière virgule.

Peut-être pas la meilleure solution, mais moins chère que de vérifier à chaque fois si c'est le dernier objet de la boucle, je suppose.

Ce n'est pas recommandé, mais vous pouvez quand même faire quelque chose comme ceci pour l'analyser.

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

Il existe un moyen possible d’éviter un if-branch dans la boucle.

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

Puisqu'une boucle for est utilisée pour parcourir un tableau, ou une structure de données itérable similaire, nous pouvons utiliser la longueur du tableau comme indiqué,

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

Avec datafile.txt contenant,

 Angela,Baker,2010-05-23
 Betty,Crockett,1990-12-07
 David,Done,2003-10-31
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top