web-dev-qa-db-fra.com

La fonction Javascript JSON.stringify ne fonctionne pas

J'ai essayé de convertir un objet JS en JSON.

JSON.stringify({a:1, toJSON: function(){}})

La chaîne JSON native ne fonctionne pas comme prévu. JSON stringify exécute la fonction toJSON dans un objet JS en interne. J'ai écrasé le code natif comme suit,

// Adding try catch for non JSON support browsers.
try{
 _jsonStringify = JSON.stringify;
 JSON.stringify = function(object){
    var fnCopy = object.toJSON; 
    object.toJSON = undefined;
    var result =  _jsonStringify(object);
    object.toJSON = fnCopy;
    return result;      
 };
}catch(e){}

Cela fonctionne bien. Y a-t-il une autre meilleure façon de faire cela? y a-t-il une raison spécifique dans le code natif exécuter toJSON function dans l'objet input?

12

En effet, JSON.stringify renverra la valeur de retour de la fonction toJSON si elle existe ( Source ).

Par exemple:

JSON.stringify({a:1, toJSON: function(){ return "a"; }});

Reviendra:

"a"

Ce comportement est décrit sur MDN . La raison en est que vous pouvez personnaliser le comportement de la sérialisation. Par exemple, supposons que je souhaite uniquement sérialiser les ID de la classe Animal dans cet exemple. Je pourrais faire ce qui suit:

var Animal = function(id, name) {
    this.AnimalID = id;
    this.Name     = name;
};

Animal.prototype.toJSON = function() {
    return this.AnimalID;
};

var animals = [];

animals.Push(new Animal(1, "Giraffe"));
animals.Push(new Animal(2, "Kangaroo"));

JSON.stringify(animals); // Outputs [1,2]

Si vous ne souhaitez pas ce comportement, votre méthode actuelle fonctionne bien. Cependant, je recommanderais de ne pas écraser le comportement de JSON.stringify, mais de nommer votre méthode autrement. Une bibliothèque externe peut utiliser la fonction toJSON dans un objet, ce qui peut entraîner des résultats inattendus.

11
David Sherret

La raison pour laquelle JSON.stringify natif ne fonctionne pas est qu’elle ne peut pas hiérarchiser les fonctions. En définissant la seule fonction, toJSON, sur non définie, JSON.stringify renvoie la valeur appropriée. Voir cette question pour plus de détails: Fonction JSON.stringify

Si vous essayez de supprimer complètement les fonctions, vous pouvez faire ceci:

JSON.stringify(object, function(key, value) {
  if (typeof value === "function") {
    return undefined;
  }
  return value;
});
0
soktinpk