Une partie de la réponse JSON d'un site Web avait ceci (... ajouté pour le contexte):
{..., now:function(){return(new Date).getTime()}, ...}
L'ajout de fonctions anonymes à JSON est-il valide? Je m'attendrais à chaque fois que vous accédez à «time» pour renvoyer une valeur différente.
json
anonymous-function
Zachary Scott
la source
la source
JSON.parse('{now:function(){return(new Date).getTime()}')
. L'inspecteur dit:Uncaught SyntaxError: Unexpected token n
Un rapide coup d'œil à la spécification JSON le confirme. Concentrez-vous sur la section «valeur».Réponses:
Non.
JSON est uniquement destiné à être un langage de description de données. Comme indiqué sur http://www.json.org , il s'agit d'un «format léger d'échange de données». - pas un langage de programmation.
Selon http://en.wikipedia.org/wiki/JSON , les "types de base" pris en charge sont:
null
la source
a==null?1:a.toString()==""
. non null ou "" alors il retournera 0 / false, vous pouvez le répliquer davantage pour travailler avec [] et {} simplement ajouter?1:a==[]?1:a.toString()=={}.toString();
à mon extrait de code précédent. alors peut-être que cette fonction vous aidera.isnull=(function(a){return (a==null?1:a.toString()==""?1:a==[]?1:a.toString()=={}.toString())?true:false})
J'utiliserais à la?1:0
place de?true:false
mais (vrai / faux)Le problème est que JSON en tant que langage de définition de données a évolué à partir de JSON en tant que notation d'objet JavaScript. Puisque Javascript prend en charge eval sur JSON, il est légitime de mettre du code JSON dans JSON (dans ce cas d'utilisation). Si vous utilisez JSON pour transmettre des données à distance, je dirais que c'est une mauvaise pratique de mettre des méthodes dans le JSON car vous n'avez peut-être pas bien modélisé votre interaction client-serveur. Et, en outre, lorsque vous souhaitez utiliser JSON comme langage de description de données, je dirais que vous pourriez vous créer des problèmes en intégrant des méthodes, car certains analyseurs JSON ont été écrits avec uniquement la description des données à l'esprit et peuvent ne pas prendre en charge les définitions de méthode dans la structure.
L'entrée JSON de Wikipedia est un bon argument pour ne pas inclure de méthodes dans JSON, citant des problèmes de sécurité:
la source
Citons l'une des spécifications - http://tools.ietf.org/html/rfc7159#section-12
La spécification du format d'échange de données The JavaScript Object Notation (JSON) indique:
Donc, toutes les réponses indiquant que les fonctions ne font pas partie de la norme JSON sont correctes.
La réponse officielle est: Non, il n'est pas valide de définir des fonctions dans les résultats JSON!
La réponse pourrait être oui, car «le code est une donnée» et «la donnée est un code». Même si JSON est utilisé comme format de sérialisation de données indépendant du langage, un tunneling de «code» à travers d'autres types fonctionnera.
Une chaîne JSON peut être utilisée pour transmettre une fonction JS au navigateur côté client pour exécution.
Cela conduit à des questions comme: Comment « exécuter du code JavaScript stocké sous forme de chaîne ».
Soyez prêt, pour lever votre drapeau "eval () is evil" et coller votre drapeau "Ne pas tunneler les fonctions via JSON" à côté.
la source
Ce n'est pas standard pour autant que je sache. Un rapide coup d'œil sur http://json.org/ le confirme.
la source
Non, certainement pas.
Si vous utilisez un sérialiseur JSON décent, il ne vous permettra pas de sérialiser une fonction comme celle-là. C'est un OBJET valide, mais pas un JSON valide. Quelle que soit l'intention de ce site Web, il n'envoie pas de JSON valide.
la source
JSON exclut explicitement les fonctions car il n'est pas censé être une structure de données JavaScript uniquement (malgré le JS dans le nom).
la source
Une réponse courte est NON ...
Regardez la raison pour laquelle:
Mais attendez ...
Il existe encore des moyens de stocker votre fonction, ce n'est généralement pas recommandé , mais toujours possible:
Nous avons dit, vous pouvez enregistrer un
string
... que diriez-vous alors de convertir votre fonction en chaîne?Ensuite, vous pouvez stringify les données en utilisant
JSON.stringify(data)
puis en utilisantJSON.parse
pour les analyser (si cette étape est nécessaire) ...Et eval pour exécuter une fonction de chaîne (avant de faire cela, faites-vous simplement savoir en utilisant eval largement déconseillé):
la source
En utilisant NodeJS (syntaxe commonJS), j'ai pu faire fonctionner ce type de fonctionnalité, j'avais à l'origine juste une structure JSON dans un fichier JS externe, mais je voulais que cette structure soit plus une classe, avec des méthodes qui pourraient être décidées à Durée.
La déclaration de 'Executor' dans myJSON n'est pas requise.
la source
Les expressions de fonction dans le JSON sont tout à fait possibles, n'oubliez pas de les mettre entre guillemets. Voici un exemple tiré de la conception de base de données noSQL:
la source
bien qu'éval ne soit pas recommandé, cela fonctionne:
la source
Laissez les guillemets ...
la source