web-dev-qa-db-fra.com

Différence entre toJSON () et JSON.Stringify ()

si vous avez besoin de lire ou de cloner tous les attributs de données d’un modèle, utilisez sa méthode toJSON (). Cette méthode retourne une copie des attributs sous forme d'objet (pas une chaîne JSON malgré son nom). (Lorsque JSON.stringify () reçoit un objet avec une méthode toJSON (), il renforce la valeur de retour de toJSON () au lieu de l'objet d'origine. Les exemples de la section précédente ont tiré parti de cette fonctionnalité lorsqu'ils ont appelé JSON.stringify. () pour enregistrer les instances de modèle.)

http://addyosmani.github.io/backbone-fundamentals/#backbone-basics

Quelqu'un peut-il me dire la différence entre ces deux manières de representing an object en JSON notation. Je suis juste confus si ceux-ci pour atteindre le même ou il y a une différence.

48
Shane

Du manuel fin :

comportement toJSON

Si un objet en cours de codification a une propriété nommée toJSON dont la valeur est une fonction, la méthode toJSON personnalise le comportement de codification JSON: au lieu de l'objet en cours de sérialisation, la valeur renvoyée par le toJSON la méthode appelée lors de l'appel sera sérialisée.

C'est pourquoi Backbone utilise la méthode toJSON pour la sérialisation et compte tenu d'une instance de modèle appelée m, vous pouvez dire des choses comme:

var string = JSON.stringify(m);

et n'obtenez que les attributs de m plutôt que de faire du bruit dont votre serveur ne se souciera pas.

Cela dit, la principale différence est que toJSON produit une valeur (un nombre, un booléen, un objet, ...) qui est convertie en chaîne JSON alors que JSON.stringify Produit toujours une chaîne.

Le Backbone par défaut toJSON est simplement ceci (pour les modèles):

return _.clone(this.attributes);

so m.toJSON() vous donne une copie peu profonde des attributs du modèle. S'il existe des tableaux ou des objets en tant que valeurs d'attribut, vous mettrez fin au partage de référence inattendu. Notez que Backbone.Model#clone aussi souffre de ce problème .

Si vous voulez cloner en toute sécurité les données d'un modèle, vous pouvez les envoyer par l'intermédiaire de JSON.stringify Puis de JSON.parse Pour obtenir une copie complète:

var data         = JSON.parse(JSON.stringify(model_instance));
var cloned_model = new M(data);

model_instance est votre instance du modèle Backbone M.

51
mu is too short
  • JSON.stringify() - Toute valeur de représentation JSON valide peut être stringifiée.

    L'utilitaire JSON.stringify(..) omettra automatiquement les valeurs undefined, function et symbol lorsqu'il les rencontrera. Si une telle valeur est trouvée dans un array, cette valeur est remplacée par null (de sorte que les informations sur la position du tableau ne sont pas modifiées). Si trouvé en tant que propriété d'un object, cette propriété sera simplement exclue.

    La codification JSON a le comportement spécial suivant: si une méthode object a une méthode toJSON() définie, cette méthode sera appelée en premier pour obtenir une valeur à utiliser pour la sérialisation.

  • toJSON() - à une valeur JSON valide adaptée à la chaîne de caractères.

    Un exemple, JSON.stringify() et object avec une référence circulaire, une erreur sera générée. toJSON() peut le réparer comme suit.

    var o = { };
    var a = {
        b: 32,
        c: o
    };
    
    // circular reference
    o.d = a;
    
    // JSON.stringify( a ); // an error caused by circular reference
    
    // define toJSON method
    a.toJSON = function() {
         return { b: this.b };
    };
    
    JSON.stringify( a ); // "{"b":32}"
    
10
zangw

Je lis aussi l'application d'Addy Osmani Developing backbone.js , et j'ai la même question. J'ai compris en essayant son exemple (la liste de tâches) dans la console.

var Todo = Backbone.Model.extend({
    defaults:{
         title:"",
         completed:false
}
});

var todo1 = new Todo(); 


console.log(todo1.toJSON())
//The console shows
//Object {title: "finish your assignment", completed: false}

console.log(JSON.stringify(todo1))
//The console shows
//{"title":"finish your assignment","completed":false}
3
Lijie Zhou