web-dev-qa-db-fra.com

Conversion d'une structure circulaire en JSON - Comment trouver de quel domaine il se plaint?

J'essaie de stringifier (...) un objet dans Chrome, et je reçois toujours un message "Conversion d'une structure circulaire en JSON", malgré le fait que (pour autant que je sache), une telle structure n'existe pas.

J'ai parcouru le code une douzaine de fois et je ne trouve aucune référence circulaire. Existe-t-il un moyen d'obtenir Chrome pour me dire de quoi il s'agit au-delà de ce message d'erreur douloureusement inutile?

35
Mike

Excusez-moi si c'est trop évident. Au moment d'écrire ces lignes, je ne sais pas ce que vous avez essayé.

insérer

console.log(the object); 

remplacer "l'objet" par l'objet que vous passez à JSON.stringify()

insérez cette ligne avant l'appel de JSON.stringify

et recherchez l'objet dans le journal de la console (shift shift J). Dans le journal de la console, l'objet sera marqué d'un symbole ">" sur lequel vous pourrez cliquer pour développer les champs.

Il se plaint d'un objet qui a des pointeurs en lui-même, comme ce genre d'objet:

A = [];
A[0] = A; 
JSON.stringify(A); // circular error
32
Paul

Vous pouvez utiliser dojox.json.ref pour trouver des références circulaires. Ce code affiche la représentation json de votre objectWithCircularReferences:

require(["dojox/json/ref"], function(){
    console.log(dojox.json.ref.toJson(objectWithCircularReferences));
});

Toute occurrence de sous-chaîne "$ ref" dans sa sortie vers la console vous aidera à localiser les références circulaires. Vous pouvez également diriger cette sortie json vers la variable globale ZZZ comme ceci si vous le souhaitez:

require(["dojox/json/ref"], function(){
    window.ZZZ = dojox.json.ref.toJson(objectWithCircularReferences);
});

Et bien sûr, vous devez inclure au préalable la bibliothèque dojo. Dans un fichier html:

<script src="//yandex.st/dojo/1.9.1/dojo/dojo.js"></script>

Dans la console Firebug:

include("//yandex.st/dojo/1.9.1/dojo/dojo.js")

Dans la console Chrome console:

SCRIPT = document.createElement('script');
SCRIPT.src = '//yandex.st/dojo/1.9.1/dojo/dojo.js';
document.body.appendChild(SCRIPT);
2
user2683246