2009-09-17 8 views
1

J'utilise json2.js pour cela:JSON parse -> stringify -> analyser cassé?

  var str = '{"elements":[{"text": "", "colour": "#66AA50", "type": "line"}]}'; 
      var obj = JSON.parse(str); 
      var str2 = JSON.stringify(obj); 
      var obj2 = JSON.parse(str2); 

chose étrange est que obj2 est une version brisée de obj, i.e. ce n'est pas identique.

Dans mon cas obj2 a un seul champ, nommé éléments qui est la chaîne est

"[{"text": "", "colour": "#66AA50", "type": "line"}]" 

testé dans FF 3.0.14

Le scénario suivant fonctionne très bien si elles sont appliquées par .toJSON Prototype()/.evalJSON()

Y at-il un problème avec mon code ou ma bibliothèque JSON?

Merci!

+0

D'où viennent les objets diffèrent? –

+0

En quoi est-ce "pas identique"? – NickFitz

+0

Quelle est la version de json2.js? Vérifiez la date dans le fichier source (par exemple, 2009-08-17)? –

Répondre

1

Works pour moi (FF3.5)

var str = '{"elements":[{"text": "", "colour": "#66AA50", "type": "line"}]}'; 
      var obj = JSON.parse(str); 
      var str2 = JSON.stringify(obj); 
      var obj2 = JSON.parse(str2); 

Equals = function(a,b) 
{ 
    //Check if the arrays are undefined/null 
    if(!a || !b) 
    return false; 

    //first compare their lengths 
    if(a.length == b.length) 
    { 
    //go thru all the vars 
    for(var i = 0; i < a.length;i++) 
    { 
     //if the var is an array, we need to make a recursive check 
     //otherwise we'll just compare the values 
     if(typeof a[i] == 'object') { 
     if(!Equals(a[i],b[i])) 
      return false; 
     } 
     else if(a[i] != b[i]) 
     return false; 
    } 
    return true; 
    } 
    else return false; 
} 

alert (Equals (obj,obj2)); //true 
alert (JSON.stringify(obj) == JSON.stringify(obj2)); //true 
alert (obj == obj2); //false (different pointer) 
0

Je ne vois pas le comportement que vous mentionnez soit. Depuis que j'ai Firefox 3.5.3, qui a une version native de l'objet JSON, j'ai attrapé le dernier json2.js (a 2009-08-17 dans le fichier source) et modifié la source pour créer un objet JSON2 au lieu d'un JSON objet. La bibliothèque est créée pour ne pas remplacer une implémentation JSON existante. Aussi, je pourrais comparer le code de la bibliothèque au code natif de Firefox. J'ai parcouru le code suivant et je n'ai pas vu les éléments listés comme une chaîne. Pouvez-vous ajouter un commentaire avec la date dans la version de json2.js que vous avez?

var str = '{"elements":[{"text": "", "colour": "#66AA50", "type": "line"}]}'; 
var obj = JSON.parse(str); 
var str2 = JSON.stringify(obj); 
var obj2 = JSON.parse(str2); 

var obj3 = JSON2.parse(str); 
var str3 = JSON2.stringify(obj3); 
var obj4 = JSON2.parse(str3); 
Questions connexes