JSON解析 - > stringify - >解析破了吗?

时间:2009-09-17 10:48:36

标签: javascript json

我正在使用json2.js

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

奇怪的是,obj2是obj的破坏版本,即它与它不完全相同。

在我的情况下,obj2只有一个字段,名为元素,设置为字符串

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

在FF 3.0.14中测试

如果通过Prototype的.toJSON()/ .evalJSON()

实现,以下方案可以正常工作

我的代码或JSON库有问题吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

适合我(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)

答案 1 :(得分:0)

我没有看到你提到的行为。由于我有Firefox 3.5.3,它有一个JSON对象的原生版本,我抓住了最新的json2.js(在源文件中有2009-08-17)并修改了源代码以创建JSON2对象而不是JSON宾语。构建库是为了不覆盖现有的JSON实现。另外,我可以将库代码与本机Firefox代码进行比较。

我介绍了以下代码,并没有看到列为字符串的元素。你可以在你拥有的json2.js版本中添加日期注释吗?

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);

答案 2 :(得分:0)

使用prototype.js时会出现一个已知问题,因为它会使JSON.stringify()中断有问题的toJSON()。但是你可以用以下方法修复它:

delete Array.prototype.toJSON

请参阅: JSON.stringify() array bizarreness with Prototype.js