2010-06-24 8 views
1

Y at-il une fonction ou d'une bibliothèque qui aura un objet JS qui a des propriétés et fonctions et stringify à JSON mais quand il vient à une fonction, il changer dans une propriété et appelez la fonction pour renvoyer sa valeur ??stringify JS objet à JSON (avoir des fonctions stringify dans une propriété)

function object() { 
    this.property = 12; 
    this.function = function() { return "This"; } 
} 

Alors cela stringify dans:

{property: 12, function: "This"} 

Toutes les idées? Juste curieux s'il y en a déjà un. Sinon, je vais prendre un coup à un. Il ne devrait pas être difficile d'étendre un JSON.stringify().

+0

BTW, ceci est juste un exemple .. Je me rends compte que cette fonction ne serait pas exacte. =) –

+4

Cela n'a pas vraiment de sens de faire cela, parce que vous supposez que toutes les fonctions n'ont pas d'arguments. –

+1

Si vous n'avez pas beaucoup de ces objets et qu'ils ont des interprétations spéciales comme la version stringifiée que vous avez décrite, il vaudrait peut-être mieux écrire votre propre méthode toJson() sur les objets. –

Répondre

1

Certains objets ont pas sérialisation trivial.Si vous souhaitez les sérialiser, vous devez le faire vous-même avec vos propres hypothèses.

fonctions (en particulier. Ceux avec fermetures) et IO cours d'eau sont quelques exemples. Dans le cas d'une fonction JS, la sérialisation (sans sérialiser le contexte entier!) Viole la sémantique de la fonction par rapport au contexte d'exécution et aux chaînes de portée. En outre, la capacité du navigateur à renvoyer le "texte" d'une fonction dépend du navigateur.

1

La méthode JSON.stringify fournit la possibilité d'inclure un argument de rappel, appelé replacer, la fonction est invoquée passer la clé et valeur de chaque propriété de votre objet, il vous êtes en mesure de détecter si la valeur est function et l'invoquer:

var obj = { 
    "property": 12, 
    "function": function() { return "This"; } 
}; 

JSON.stringify(obj, function (key, value) { 
    if (typeof value == 'function') { 
    return value(); 
    } 
    return value; 
}); 
+0

Cela a presque fonctionné. Il ne semble pas appeler le callback() si c'est une fonction. Il semble que le code de stringify les exclue automatiquement. Je vais donc devoir modifier le code JSON pour qu'il soit appelé dans le callback s'il en est détecté un. Grande trouvaille! –

+0

@ James, Merci, oh, j'ai oublié de vous dire que Firefox 3.6 a un [bug de mise en œuvre] (http://skysanders.net/subtext/archive/2010/02/24/confirmed-bug-in-firefox-3.6 -native-json-implementation.aspx) en utilisant cet argument 'replacer'. Une autre option serait d'implémenter votre fonction 'stringify' personnalisée, quelque chose comme [this] (http://github.com/remy/console/blob/master/console.js#L4). – CMS

Questions connexes