comme décrit à http://www.json.org/js.html , JavaScript Les objets peuvent dicter comment ils sont sérialisés par JSON.Stringify () en implémentant une méthode Tojson (). Pour un objet arbitraire, cette méthode n'est pas définie, tandis que les chiffres et les cordes semblent mettre en œuvre la méthode. Je suis curieux - pourquoi les objets n'ont pas de mise en œuvre? P>
Edit: J'ai initialement mentionné que les tableaux ont cette méthode - ils ne le font pas. Je m'excuse pour la confusion. P>
5 Réponses :
Je ne pense pas que c'est le cas que les chiffres, etc. ont des implémentations de Tokson par défaut. Peut-être que vous utilisez un prototype ou un autre cadre? P>
http://www.w3schools.com/jsref/jsref_obj_number.asp p>
http://www.w3schools.com/jsref/jsref_obj_array.asp p>
de http://www.prototypejs.org/learn/json : p>
codage p>
JSON de prototype codant légèrement diffère de Crockford's la mise en œuvre telle qu'elle ne s'étend pas Objet.pototype. Ce qui suit Les méthodes sont disponibles: numéro # TOJSON, String # Tojson, Array # Tojson, Hash # tojson, date # tojson et Objet.tojson. P> blockQuote>
Rien n'a une implémentation de Tokson par défaut dans la spécification ECMAScript. JSON.ORG/JSON2.JS donne des implémentations par défaut pour les types de listes Jeff, mais ceux-ci ne font que déléguer à ValueOf () code>.
31.1k Reputilisateur référençant W3Schools ...> :(
Je doute que c'est une raison - les tableaux ne semblent pas les avoir non plus. Voici comment je l'implémenterais:
Array.prototype.toJSON = Object.prototype.toJSON = function() { return JSON.stringify(this); }
Cela ne causerait-il pas une récursion infinie quelque part comme JSON.Stringify appels tojson (clé) code>?
json.stringify ({}); code>
RangeError: taille maximale de la pile d'appels dépassée code>
C'est une norme pour ne pas mettre en œuvre des fonctions sur des objets arbitraires. P>
Essayez console.log ({}) code> et vous ne verrez rien. p>
Ces méthodes que vous mentionnez ont été ajoutées par certains moteurs JavaScript (AFaik les dernières versions de V8 et de TracemonKey Mettez-les):
String.prototype.toJSON Boolean.prototype.toJSON Number.prototype.toJSON Date.prototype.toJSON
En fait, il existe une motivation valide pour avoir Tojson () au lieu d'utiliser la valeurOf: polymorphisme. Si l'objet implémente TOJSON (), vous pouvez simplement faire n'importe quoi TOLOBJ.TOJSON () et arrêtez de vous inquiéter du type d'objet, ou si la fonction est définie ou non.
tandis que @CMS est correcte, le navigateur fait les em> les a ajoutés, le point a été entièrement manqué. La raison en est que la spécification un exemple serait une structure de données définie em> dont la structure est en fait un objet qui a une valeur donc, dans un Nutshell, son pour fournir espère que cela aide. p> h3> tojson code> pour tout objet qui, à son tour, est appelée à
code> méthode. Cela permettrait à celui d'écrire
ceci.tojson = valeurs; code> pour fournir le
json.stringify code> méthode la stratégie de sérialisation appropriée. P>
json.stringify code> la stratégie correcte pour la sortie de structures alternatives. P>
Clarification ultérieure: J'utilise JavaScript sous forme de langage de script (côté serveur) et expérimente avec V8, Tracémonkey et Rhino en tant qu'interprecteurs. Dans chaque cas, '' .tojson est une fonction, tandis que {} .tojson est indéfini.