103 votes

Est-il valide de définir des fonctions dans les résultats JSON?

Une partie de la réponse JSON d'un site Web contenait ceci (... ajouté pour 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.

109voto

Mike Points 5839

JSON est purement destiné à être un langage de description de données. Par http://www.json.orgil est un "léger d'échange de données au format." - pas un langage de programmation.

Par http://en.wikipedia.org/wiki/JSONla "base" types de prises en charge sont:

  • Nombre (entier, réel, ou flottant point)
  • Chaîne de caractères (entre guillemets Unicode avec échappement barre oblique inverse)
  • Boolean (vrai et faux)
  • Tableau (à l'ordre de l' séquence de valeurs, séparées par des virgules et entre crochets)
  • Objet (collection de la clé:valeur paires, séparées par des virgules et clos entre accolades)
  • null

16voto

harschware Points 3520

Le problème est que JSON comme un langage de définition de données évolué du JSON JavaScript Object Notation. Depuis Javascript prend en charge eval sur JSON, il est légitime de mettre du code JSON à l'intérieur de JSON (dans le cas d'utilisation). Si vous êtes en utilisant JSON pour transmettre les données à distance, alors je dirais que c'est une mauvaise pratique de placer des méthodes dans le JSON parce que vous ne pouvez pas avoir modélisé votre l'interaction client-serveur. Et, de plus, lorsque l'on souhaite utiliser JSON comme l'une des données de description de la langue, je dirais que vous pourriez avoir des ennuis par l'incorporation de méthodes, car certains JSON analyseurs ont été écrites avec seulement la description des données à l'esprit et ne peut pas soutenir les définitions de méthode dans la structure.

Wikipédia JSON entrée fait une bonne affaire pour ne pas y compris les méthodes en JSON, invoquant des raisons de sécurité:

Sauf si vous devez absolument faire confiance à la source du texte, et vous avez un besoin d'analyser et d'accepter un texte qui n'est pas strictement JSON conforme, vous devriez éviter de eval() et l'utilisation de JSON.parse() ou une autre JSON analyseur spécifique au lieu. Un parser JSON ne reconnaît que le JSON texte et le rejet d'un autre texte, qui peut contenir du JavaScript malveillant. Dans les navigateurs qui fournissent native prise en charge de JSON, JSON analyseurs sont aussi beaucoup plus rapide que la fonction eval. Il est prévu que le natif de support JSON sera inclus dans le prochain standard ECMAScript.

8voto

jldupont Points 31331

Ce n'est pas standard pour autant que je sache. Un coup d’œil sur http://json.org/ le confirme.

5voto

jvenema Points 21499

Non, certainement pas.

Si vous utilisez un sérialiseur JSON correct, il ne vous laissera pas sérialiser une telle fonction. C'est un OBJECT valide, mais pas un JSON valide. Quelle que soit l'intention de ce site Web, il n'envoie pas de code JSON valide.

4voto

Tatu Ulmanen Points 52098

JSON exclut explicitement les fonctions car il ne s'agit pas d'une structure de données exclusivement JavaScript (malgré le nom JS).

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