8346 votes

Les commentaires peuvent-ils être utilisés dans JSON ?

Puis-je utiliser des commentaires dans un fichier JSON ? Si oui, comment ?

181 votes

@StingyJack : Pour expliquer des choses qui ne sont pas évidentes, ou toute autre chose que l'on peut faire avec des commentaires. Pour ma part, j'ai souvent des commentaires dans les fichiers de données. XML, les fichiers ini et de nombreux autres formats contiennent des dispositions relatives aux commentaires.

29 votes

Si vous, comme moi, vous demandiez si //comments sont OK pour le cas d'utilisation spécifique d'un fichier de configuration de Sublime Text, la réponse est oui (à partir de la version 2). Sublime Text ne s'en plaindra pas, du moins, alors qu'il se plaindra de {"__comment": ...} dans la console, car il s'agit d'un champ inattendu.

14 votes

Et c'est peut-être une des raisons pour lesquelles TOML a été créé

6203voto

Eli Points 14599

Non.

Le JSON ne contient que des données, et si vous incluez un commentaire, il s'agira également de données.

Vous pourriez avoir un élément de données désigné appelé "_comment" (ou quelque chose comme ça) qui doit être ignoré par les applications qui utilisent les données JSON.

Il serait probablement préférable de placer le commentaire dans les processus qui génèrent/reçoivent le JSON, car ils sont censés savoir à l'avance ce que seront les données JSON, ou du moins leur structure.

Mais si vous avez décidé de le faire :

{
   "_comment": "comment text goes here...",
   "glossary": {
      "title": "example glossary",
      "GlossDiv": {
         "title": "S",
         "GlossList": {
            "GlossEntry": {
               "ID": "SGML",
               "SortAs": "SGML",
               "GlossTerm": "Standard Generalized Markup Language",
               "Acronym": "SGML",
               "Abbrev": "ISO 8879:1986",
               "GlossDef": {
                  "para": "A meta-markup language, used to create markup languages such as DocBook.",
                  "GlossSeeAlso": ["GML", "XML"]
               },
               "GlossSee": "markup"
            }
         }
      }
   }
}

265 votes

Il pourrait être utile d'avoir une sorte de préfixe sur le commentaire réel au cas où il y aurait un champ valide nommé commentaire : "__comment":"comment text goes here...",

29 votes

BTW, la bibliothèque json pour Java google-gson a un support pour les commentaires.

12 votes

Et si je voulais un commentaire séparé sur l'élément Accronym et Abbrev propriétés ? J'ai utilisé ce modèle auparavant mais j'ai arrêté car il ne me permet pas de le faire. C'est un hack. Peut-être que si je fais précéder le nom d'une propriété de __comment__ à la place. C'est "__comment__Abbrev", encore un hack, mais qui me permettrait de commenter toutes les propriétés.

1981voto

stakx Points 29832

Non des commentaires de la forme //… ou /*…*/ ne sont pas autorisés dans JSON. Cette réponse est basée sur :

  • https://www.json.org
  • RFC 4627 : Le site application/json Type de média pour la notation d'objets JavaScript (JSON)
  • RFC 8259 Le format d'échange de données JavaScript Object Notation (JSON) (remplace les RFC 4627, 7158 et 7159).

80 votes

Si vous souhaitez annoter votre JSON avec des commentaires (ce qui en fait un JSON invalide), réduisez-le avant de l'analyser ou de le transmettre. Crockford lui-même l'a reconnu en 2012 dans le contexte des fichiers de configuration.

31 votes

@alkuzad : Quand il s'agit de grammaires formelles, il doit y avoir quelque chose qui dit explicitement qu'elles sont autorisé, et non l'inverse. Par exemple, prenez le langage de programmation de votre choix : Ce n'est pas parce qu'une fonctionnalité souhaitée (mais manquante) n'est pas explicitement interdite que votre compilateur la reconnaîtra comme par magie.

9 votes

Oui. Le format JSON comporte beaucoup d'espaces morts entre les éléments et n'est pas sensible à l'espace dans ces régions, il n'y a donc aucune raison pour que vous ne puissiez pas avoir des commentaires sur une ou plusieurs lignes. De nombreux analyseurs syntaxiques et mineurs prennent également en charge les commentaires JSON, il suffit donc de s'assurer que votre analyseur syntaxique les prend en charge. JSON est beaucoup utilisé pour les données d'application et les paramètres de configuration, les commentaires sont donc nécessaires maintenant. La "spécification officielle" est une bonne idée, mais elle est insuffisante et obsolète, alors tant pis. Minimisez votre JSON si vous êtes préoccupé par la taille de la charge utile ou les performances.

896voto

Kyle Simpson Points 3800

Incluez des commentaires si vous le souhaitez, mais enlevez-les avec un "minifieur" avant d'analyser ou de transmettre.

Je viens de publier JSON.minify() qui supprime les commentaires et les espaces d'un bloc de JSON et en fait un JSON valide qui peut être analysé. Vous pouvez donc l'utiliser comme suit :

JSON.parse(JSON.minify(my_str));

Lorsque je l'ai publié, j'ai reçu un énorme retour de bâton de la part de personnes qui n'étaient pas d'accord avec l'idée même de ce projet, alors j'ai décidé d'écrire un article de blog complet sur les raisons pour lesquelles les commentaires ont un sens en JSON . Il inclut ce commentaire remarquable du créateur de JSON :

Supposons que vous utilisiez JSON pour conserver des fichiers de configuration, que vous souhaitez annoter. Allez-y et insérez tous les commentaires que vous voulez. Puis faites passer le tout par JSMin avant de le transmettre à votre analyseur JSON. - Douglas Crockford, 2012

J'espère que c'est utile à ceux qui ne sont pas d'accord avec le pourquoi. JSON.minify() pourrait être utile.

167 votes

Le seul problème que j'ai avec JSON.minify() est qu'il est vraiment très lent. J'ai donc créé ma propre implémentation qui fait la même chose : gist.github.com/1170297 . Sur certains gros fichiers de test, votre mise en œuvre prend 74 secondes et la mienne 0,06 seconde.

62 votes

Ce serait formidable si vous pouviez soumettre l'algorithme alternatif suggéré au dépôt github de JSON.minify(), afin qu'il puisse être porté dans toutes les langues prises en charge : github.com/getify/json.minify

3 votes

Le JSON de Perl supporte les commentaires #.

494voto

Artur Czajka Points 3327

Les commentaires ont été supprimés de JSON à dessein.

J'ai supprimé les commentaires de JSON parce que j'ai vu que les gens les utilisaient pour contenir des directives d'analyse, une pratique qui aurait détruit l'interopérabilité. Je sais que l'absence de commentaires rend certaines personnes tristes, mais cela ne devrait pas être le cas.

Supposons que vous utilisiez JSON pour conserver des fichiers de configuration, que vous souhaitez annoter. Allez-y et insérez tous les commentaires que vous voulez. Puis faites passer le tout par JSMin avant de le transmettre à votre analyseur JSON.

Source : Déclaration publique de Douglas Crockford sur G+

249 votes

Je croyais que JSON était censé être plus lisible par l'homme que, disons, XML ? Les commentaires sont pour la lisibilité.

32 votes

Quoi qu'il en soit, vous pourriez être vilain et ajouter des directives d'analyse syntaxique dans le JSON : {"__directives":{"#n#" : "DateTime.Now"}, "validdate" : "#n#"}... Il semble que YAML soit la voie à suivre alors...

2 votes

Suppression de /* */ Les commentaires ont également fait de JSON un meilleur sous-ensemble de YAML.

225voto

Ped Points 1981

AVIS DE NON-RESPONSABILITÉ : VOTRE GARANTIE EST ANNULÉE

Comme cela a été souligné, ce hack tire profit de l'implémentation de la spécification. Tous les analyseurs JSON ne comprennent pas ce type de JSON. Les analyseurs de flux, en particulier, s'étrangleront.

C'est une curiosité intéressante, mais vous ne devrait vraiment pas l'utiliser pour quoi que ce soit. . Vous trouverez ci-dessous la réponse originale.


J'ai trouvé une petite astuce qui vous permet de placer des commentaires dans un fichier JSON qui n'affecteront pas l'analyse syntaxique, ni ne modifieront les données représentées de quelque manière que ce soit.

Il apparaît que lors de la déclaration d'un objet littéral, vous pouvez spécifier deux valeurs avec la même clé, et la dernière a la priorité. Croyez-le ou non, il s'avère que les analyseurs JSON fonctionnent de la même manière. Nous pouvons donc l'utiliser pour créer des commentaires dans le JSON source qui ne seront pas présents dans une représentation d'objet analysée.

({a: 1, a: 2});
// => Object {a: 2}
Object.keys(JSON.parse('{"a": 1, "a": 2}')).length; 
// => 1

Si nous appliquons cette technique, votre fichier JSON commenté pourrait ressembler à ceci :

{
  "api_host" : "The hostname of your API server. You may also specify the port.",
  "api_host" : "hodorhodor.com",

  "retry_interval" : "The interval in seconds between retrying failed API calls",
  "retry_interval" : 10,

  "auth_token" : "The authentication token. It is available in your developer dashboard under 'Settings'",
  "auth_token" : "5ad0eb93697215bc0d48a7b69aa6fb8b",

  "favorite_numbers": "An array containing my all-time favorite numbers",
  "favorite_numbers": [19, 13, 53]
}

Le code ci-dessus est JSON valide . Si vous l'analysez, vous obtiendrez un objet comme celui-ci :

{
    "api_host": "hodorhodor.com",
    "retry_interval": 10,
    "auth_token": "5ad0eb93697215bc0d48a7b69aa6fb8b",
    "favorite_numbers": [19,13,53]
}

Ce qui signifie qu'il n'y a aucune trace des commentaires, et qu'ils n'auront pas d'effets secondaires bizarres.

Bon piratage !

168 votes

De la spécification : Les noms à l'intérieur d'un objet DOIVENT être uniques.

2 votes

C'est vrai, mais ce n'est pas une erreur de syntaxe, et toutes les implémentations le gèrent de la même manière. Donc je pense que c'est assez sûr à utiliser. Pas philosophiquement, mais pratiquement.

128 votes

"toutes les implémentations traitent cela de la même manière" - C'est une chose difficile à prouver.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X