木野狐(Neil Chen)

Speak less, do more.

http://www.json.org/json2.js

因为之前的版本会注入对象的 prototype, 导致很多问题。最常见的,是

for (var key in obj) {
  doSomething(obj);
}

的时候,会枚举到 toJSONString 这个方法,搞得现在代码要这样写:

for (var key in obj) {
    if (key != 'toJSONString') {
        doSomething(obj);
    }
}

真是很郁闷那。
如果用 Visual Studio 调试 js, 或者用 IE Developer toolbar,里面显示出来的 DOM 真是惨不忍睹啊。

还好现在总算改的及时,看了下代码里的注释,是 2007-11-06 改掉的。
不过,现在的方法签名改成了:

JSON.stringify(value, whitelist)
JSON.parse(text, filter)

原来是:

obj.toJSONString()
string.parseJSON(filter)


posted on 2007-11-28 16:36 木野狐(Neil Chen) 阅读(676) 评论(5)  编辑 收藏 所属分类: 网页技术

Feedback

最老版本的json实现是没有注入prototype的。
可能后来作者觉得增加个prototype更方便吧,不过确实存在上面说的问题。
  回复  引用    

#2楼 [楼主] 2007-11-28 16:59 木野狐(Neil Chen)      
@vicalloy
哦,最老的时候不清楚,我用的上一版是 2007-08-19 的。
  回复  引用  查看    

#3楼  2007-11-28 18:42 Jeffrey Zhao      
扩展Object.prototype是一件绝对要避免的事情,呵呵
  回复  引用  查看    

#4楼 [楼主] 2007-11-29 10:27 木野狐(Neil Chen)      
@Jeffrey Zhao
是啊,可以作为 js 的 best practice 之一了。
  回复  引用  查看    

#5楼  2008-03-17 11:48 Kai.Ma      
JSON.parse方法有时候会转换不了JSON字符串
没有
eval('('+...+)')管用。

比如这段:
-----------
{"UserInfoID":"00000000-0000-0000-0000-000000000000","UserName":"Kai.Ma","PassWord":"","PassWordArc":"","Email":"","Mobile":"","Sex":0,"Province":"00000000-0000-0000-0000-000000000000","City":"00000000-0000-0000-0000-000000000000","District":"00000000-0000-0000-0000-000000000000","BusinessArea":"00000000-0000-0000-0000-000000000000","ContactName":"","Birthday":new Date(-59011459200000),"CardName":"","CardID":"","Phone":"","Address":"","QQ":"","Head":"","Job":0,"Job1":0,"Interest":"","LastLogin":new Date(-59011459200000),"LastIp":"","RegTime":new Date(-59011459200000),"Hits":0,"Grade":"00000000-0000-0000-0000-000000000000","IsRecommend":0,"UserClass":0,"UserMoney":0,"UserPoint":0,"UserLevel":"00000000-0000-0000-0000-000000000000","IsLock":0,"Intro":"","Remark":"","BirthdayString":"","LastLoginString":"","RegTimeString":"","IsPersist":false,"DisplayName":"Kai.Ma"}
-----------------
  回复  引用  查看