我正在使用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库有问题吗?
谢谢!
答案 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