tutorial - récupérer données json javascript




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

Puis-je utiliser des commentaires dans un fichier JSON? Si c'est le cas, comment?

https://code.i-harness.com


Désolé, nous ne pouvons pas utiliser de commentaires dans JSON ... Consultez le diagramme de syntaxe pour JSON sur JSON.org .

Douglas Crockford explique " plus.google.com/118095276221607585885/posts/RK8qyGVaGSr ":

J'ai supprimé les commentaires de JSON parce que je voyais des personnes les utiliser pour conserver des directives d'analyse syntaxique, une pratique qui aurait détruit l'interopérabilité. Je sais que le manque de commentaires rend certaines personnes tristes, mais cela ne devrait pas.

Supposons que vous utilisiez JSON pour conserver les fichiers de configuration que vous souhaitez annoter. Allez-y et insérez tous les commentaires que vous aimez. Puis transmettez-le à JSMin avant de le remettre à votre analyseur JSON.


JSON ne prend pas en charge les commentaires. De plus, il n’a jamais été prévu d’utiliser les fichiers de configuration pour lesquels des commentaires seraient nécessaires.

Hjson est un format de fichier de configuration pour les humains. Syntaxe détendue, moins d'erreurs, plus de commentaires.

Consultez hjson.org pour les bibliothèques JavaScript, Java, Python, PHP, Rust, Go, Ruby et C #.


L'idée derrière JSON est de fournir un échange de données simple entre applications. Ce sont généralement basés sur le Web et la langue est JavaScript.

Cela n'autorise pas vraiment les commentaires en tant que tels, cependant, le fait de passer un commentaire comme une des paires nom / valeur dans les données fonctionnerait certainement, bien que ces données devraient évidemment être ignorées ou traitées spécifiquement par le code d'analyse syntaxique.

Cela dit, le fichier JSON ne doit pas contenir de commentaires au sens traditionnel. Ce ne devrait être que les données.

Consultez le site Web JSON pour plus de détails.


LIMITATION DE RESPONSABILITÉ: VOTRE GARANTIE EST ANNULÉE

Comme il a été souligné, ce hack tire parti de la mise en œuvre de la spécification. Tous les analyseurs JSON ne comprendront pas ce type de JSON. Les parseurs en streaming vont s’étouffer.

C'est une curiosité intéressante, mais vous ne devriez vraiment pas l'utiliser pour quoi que ce soit . Voici la réponse originale.

J'ai trouvé un petit hack qui vous permet de placer des commentaires dans un fichier JSON sans affecter l'analyse ni de modifier les données représentées.

Il semble que lorsque vous déclarez un littéral d'objet, vous pouvez spécifier deux valeurs avec la même clé et la dernière est prioritaire. 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é.

({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 un code 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 étranges.

Joyeux piratage!


Les commentaires ont été supprimés de JSON par conception.

J'ai supprimé les commentaires de JSON parce que je voyais des personnes les utiliser pour conserver des directives d'analyse syntaxique, une pratique qui aurait détruit l'interopérabilité. Je sais que le manque de commentaires rend certaines personnes tristes, mais cela ne devrait pas.

Supposons que vous utilisiez JSON pour conserver les fichiers de configuration que vous souhaitez annoter. Allez-y et insérez tous les commentaires que vous aimez. Puis transmettez-le à JSMin avant de le remettre à votre analyseur JSON.

Source: plus.google.com/118095276221607585885/posts/RK8qyGVaGSr


Non.

Le JSON doit tous être 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) qui serait ignoré par les applications qui utilisent les données JSON.

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

Mais si vous avez décidé de:

{
   "_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"
            }
         }
      }
   }
}

Si votre fichier texte, qui est une chaîne JSON, va être lu par un programme, serait-il difficile de supprimer les commentaires de style C ou C ++ avant de l'utiliser?

Réponse: Ce serait un one-line. Si vous le faites, les fichiers JSON peuvent être utilisés comme fichiers de configuration.


Si vous utilisez Jackson comme analyseur JSON, procédez comme suit pour l'activer afin d'autoriser les commentaires:

ObjectMapper mapper = new ObjectMapper().configure(Feature.ALLOW_COMMENTS, true);

Ensuite, vous pouvez avoir des commentaires comme celui-ci:

{
  key: "value" // Comment
}

Et vous pouvez également avoir des commentaires commençant par # en définissant:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

Mais en général (comme indiqué précédemment), la spécification n’autorise pas les commentaires.


Soupir. Pourquoi ne pas simplement ajouter des champs, par exemple

{
    "note1" : "This demonstrates the provision of annotations within a JSON file",
    "field1" : 12,
    "field2" : "some text",

    "note2" : "Add more annotations as necessary"
}

Assurez-vous simplement que vos noms "notex" ne sont pas en conflit avec de vrais champs.


Tu ne peux pas. JSON.org moins, c’est mon expérience d’un coup d’œil rapide à JSON.org .

JSON a sa syntaxe visualisée sur cette page. Il n'y a pas de note sur les commentaires.


Vous devriez plutôt écrire un schéma JSON . Le schéma JSON est actuellement un projet de spécification Internet. Outre la documentation, le schéma peut également être utilisé pour valider vos données JSON.

Exemple:

{
    "description":"A person",
    "type":"object",
    "properties":
        {
            "name":
                {
                    "type":"string"
                },
            "age":
                {
                    "type":"integer",
                    "maximum":125
                }
        }
}

Vous pouvez fournir de la documentation en utilisant l'attribut de schéma de description .


Inclure les commentaires si vous choisissez; éliminez-les avec un minifier avant de les analyser ou de les transmettre.

Je viens de publier JSON.minify() qui supprime les commentaires et les espaces d'un bloc de JSON et le rend valide JSON pouvant être analysé. Donc, vous pourriez l'utiliser comme:

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

Lorsque je l'ai publié, j'ai reçu une réaction violente en me disant que je devais écrire un article de blog complet expliquant pourquoi les commentaires ont du sens dans JSON . Il comprend ce commentaire notable du créateur de JSON:

Supposons que vous utilisiez JSON pour conserver les fichiers de configuration que vous souhaitez annoter. Allez-y et insérez tous les commentaires que vous aimez. Puis transmettez-le à JSMin avant de le remettre à votre analyseur JSON. - plus.google.com/118095276221607585885/posts/RK8qyGVaGSr

J'espère que cela sera utile à ceux qui ne sont pas d'accord avec la raison pour laquelle JSON.minify () pourrait être utile.


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

  • http://www.json.org
  • RFC 4627 : type de média application/json pour la notation d'objet JavaScript (JSON)
  • RFC 7159 Format d'échange de données Notation d'objet JavaScript (JSON) - Obsolètes: 4627, 7158

JSON est très utile pour les fichiers de configuration et autres utilisations locales, car il est omniprésent et beaucoup plus simple que XML.

Si les utilisateurs ont des raisons sérieuses de ne pas avoir de commentaires dans JSON lors de la communication de données (valides ou non), alors JSON peut éventuellement être scindé en deux:

  • JSON-COM: JSON sur le réseau ou règles applicables lors de la communication de données JSON.
  • JSON-DOC: document JSON ou JSON dans des fichiers ou localement. Règles qui définissent un document JSON valide.

JSON-DOC autorisera les commentaires. D'autres différences mineures peuvent exister, telles que la gestion des espaces. Les analyseurs peuvent facilement convertir une spécification à l’autre.

En ce qui concerne la plus.google.com/118095276221607585885/posts/RK8qyGVaGSr de Douglas Crockford sur cette question (référencé par @Artur Czajka)

Supposons que vous utilisiez JSON pour conserver les fichiers de configuration que vous souhaitez annoter. Allez-y et insérez tous les commentaires que vous aimez. Puis transmettez-le à JSMin avant de le remettre à votre analyseur JSON.

Nous parlons d'un problème de fichier de configuration générique (cross language / platform), et il répond avec un utilitaire spécifique à JS!

Certes, une minify spécifique à JSON peut être implémentée dans n’importe quelle langue, mais normalisez-la pour qu’elle devienne omniprésente dans les analyseurs syntaxiques, dans toutes les langues et sur toutes les plateformes. forums en ligne, et inciter les gens à leur dire que c'est une mauvaise idée ou à suggérer qu'il est facile d'implémenter des commentaires de suppression dans des fichiers texte.

L'autre problème est l'interopérabilité. Supposons que vous ayez une bibliothèque ou une API ou tout type de sous-système associé à des fichiers de configuration ou de données. Et ce sous-système doit être accessible à partir de différentes langues. Ensuite, allez-vous dire aux gens: en passant, n'oubliez pas de supprimer les commentaires des fichiers JSON avant de les transmettre à l'analyseur!


Pour couper un élément JSON en plusieurs parties, j'ajoute des lignes de type "commentaire factice":

{

"#############################" : "Part1",

"data1"             : "value1",
"data2"             : "value2",

"#############################" : "Part2",

"data4"             : "value3",
"data3"             : "value4"

}

Ceci est une question "pouvez-vous" . Et voici une réponse "oui" .

Non, vous ne devez pas utiliser de membre d'objet duplicatif pour insérer des données de canal latéral dans un codage JSON. (Voir "Les noms dans un objet DEVRAIENT être uniques" dans le RFC ).

Et oui, vous pouvez insérer des commentaires autour du JSON , que vous pouvez analyser.

Mais si vous souhaitez insérer et extraire des données de canaux secondaires arbitraires dans un JSON valide, voici une réponse. Nous tirons parti de la représentation non unique des données dans un codage JSON. Ceci est autorisé * dans la section deux du RFC sous "les espaces sont autorisés avant ou après l'un des six caractères structurels".

* La RFC indique uniquement "les espaces sont autorisés avant ou après l'un des six caractères structurels", sans mentionner explicitement les chaînes, les nombres, "false", "true" et "null". Cette omission est ignorée dans TOUTES les implémentations.

Tout d’abord, canonisez votre JSON en le réduisant:

$jsonMin = json_encode(json_decode($json));

Puis encodez votre commentaire en binaire:

$hex = unpack('H*', $comment);
$commentBinary = base_convert($hex[1], 16, 2);

Puis steg votre binaire:

$steg = str_replace('0', ' ', $commentBinary);
$steg = str_replace('1', "\t", $steg);

Voici votre sortie:

$jsonWithComment = $steg . $jsonMin;

Il y a une bonne solution (hack), qui est un JSON valide. Il suffit de faire la même clé deux fois (ou plus). Par exemple:

{
  "param" : "This is the comment place",
  "param" : "This is value place",
}

Donc, JSON comprendra ceci comme:

{
  "param" : "This is value place",
}

L'auteur de JSON souhaite que nous incluions des commentaires dans le JSON, mais les supprimions avant de les analyser (voir le plus.google.com/118095276221607585885/posts/RK8qyGVaGSr fourni par Michael Burr). Si JSON doit avoir des commentaires, pourquoi ne pas les normaliser et laisser l’analyseur JSON faire le travail? Je ne suis pas d'accord avec la logique, mais, hélas, c'est la norme. Utiliser une solution YAML comme suggéré par d'autres est une bonne chose, mais cela nécessite une dépendance à la bibliothèque.

Si vous souhaitez supprimer les commentaires, mais ne pas créer de dépendance à la bibliothèque, voici une solution à deux lignes, qui fonctionne pour les commentaires de style C ++, mais qui peut être adaptée à d'autres:

var comments = new RegExp("//.*", 'mg');
data = JSON.parse(fs.readFileSync(sample_file, 'utf8').replace(comments, ''));

Notez que cette solution ne peut être utilisée que dans les cas où vous pouvez être sûr que les données JSON ne contiennent pas l'initiateur de commentaire, par exemple ('//').

Une autre façon de réaliser l'analyse JSON, la suppression de commentaires et l'absence de bibliothèque supplémentaire, consiste à évaluer le JSON dans un interpréteur JavaScript. La mise en garde avec cette approche, bien sûr, est que vous souhaitez uniquement évaluer des données non corrompues (aucune entrée utilisateur non fiable). Voici un exemple de cette approche dans Node.js - autre mise en garde: l'exemple suivant ne lira les données qu'une seule fois, puis sera mis en cache:

data = require(fs.realpathSync(doctree_fp));

Nous utilisons strip-json-commentspour notre projet. Il supporte quelque chose comme:

/*
 * Description 
*/
{
    // rainbows
    "unicorn": /* ❤ */ "cake"
}

Simplement npm install --save strip-json-commentsinstaller et utiliser comme:

var strip_json_comments = require('strip-json-comments')
var json = '{/*rainbows*/"unicorn":"cake"}';
JSON.parse(strip_json_comments(json));
//=> {unicorn: 'cake'}

Si vous utilisez JSON5 vous pouvez inclure des commentaires.

JSON5 est une extension proposée à JSON qui vise à faciliter la rédaction et la maintenance manuelles à la main. Pour ce faire, il ajoute des fonctionnalités de syntaxe minimale directement à partir de ECMAScript 5.





comments