JavaScript中的JSON

JavaScript 是一种通用的编程语言, 从一开始就被作为Netscape Navigator浏览器的页面脚本执行语言. 它仍然被广泛的认为是Java的一个子集, 尽管事实并不是这样. 它是一种类 Scheme 的语言, 同时有着类 C 的语法和 弱对象. JavaScript在ECMAScript的 ECMAScript Language Specification, Third Edition 中被标准化.

JSON 是JavaScript对象文字符号的一个子集. 由于JSON是JavaScript的一个子集, 它可以自如的在JavaScript中使用.

var myJSONObject = {
"bindings": [
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
{"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
{"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
]
};		

在这个例子中, 创建了只包含一个成员 bindings 的对象, 而这个对象又包含了一个拥有三个对象的数组, 其中每个数组对象包含了 ircEvent, method, regex 三个成员.

成员可以用 点(.) 或者 下标([ ]) 操作符来引用.

myJSONObject.bindings[0].method // "newURI"

要将 JSON 字符串转换成一个对象, 我们可以用 eval() 函数. eval() 会触发JavaScript的编译器. 因为JSON是JavaScript的一个真子集, 编译器会正确的解析字符串内容, 同时生成一个对象结构. 字符串必须用括号括起来, 以免产生JavaScript语法歧义.

var myObject = eval('(' + myJSONtext + ')');

eval 函数速度很快. 它可以编译和执行任何JavaScript代码, 这里可能存在安全问题. 当源是可信的并且完整的时候, 可以使用 eval. 而用JSON解析器是更安全的方式. 在使用XMLHttpRequest的Web程序中, 只允许在同源的情况下通信, 因此它是可信的. 但它不一定是完整的. 如果服务器用的不是严谨的JSON编码, 或者它没有严格检查所有输入内容, 它也可以提供无效的JSON, 同时带上危险的脚本. 此时, eval 将会执行该脚本, 产生危害.

为了解决这个问题, 应该使用JSON解析器. JSON解析器只会识别JSON文本, 拒绝所有脚本. 在提供原生JSON支持的浏览器中, JSON解析器比 eval 更快. 原生的JSON支持很有可能包含在ECMAScript下一个版本的标准中.

var myObject = JSON.parse(myJSONtext, reviver);

可选的reviver参数是一个函数, 在每个键/值在每一级的最终结果后都会被调用. 每个值将会被替换为reviver函数的返回结果. 它可以用来将对象组织成伪类(pseudoclasses)的一个实例, 或者将date字符串转换成Date对象

myData = JSON.parse(text, function (key, value) {
var type;
if (value && typeof value === 'object') {
type = value.type;
if (typeof type === 'string' && typeof window[type] === 'function') {
return new (window[type])(value);
}
}
return value;
});

JSON字符串化是一个反过来的动作, 它将JavaScript的数据结构转化成JSON字符串. JSON不支持循环的数据结构, 因此在用JSON字符串化的时候, 不要给它循环引用的结构.

var myJSONText = JSON.stringify(myObject, replacer);

如果 stringify 方法发现对象包含了一个 toJSON 的方法, 它会调用这个方法, 然后将返回的结果字符串化. 这允许对象自己定义它们的JSON表示方式.

字符串化方法可以带一个可选的字符串数组. 这些字符串可以用来选择哪些属性将会被包含在生成的JSON文本中.

字符串化方法还可以使用一个可选的 replacer 函数, 这个函数将会在结构中的每个值的 toJSON 方法(如果存在的话) 后调用. 它将接收每个key和value作为它的参数. 这会被绑定在包含key的对象中. 它返回的值会被字符串化.

没有JSON表示的值(比如函数和undefined)将会被排除.

无限大的数字将会被替换为NULL, 要替换其他值, 你可以用类似的 replacer 函数:

function replacer(key, value) {
if (typeof value === 'number' && !isFinite(value)) {
return String(value);
}
return value;
}		

提供一个合适的 reviver 函数给 JSON.parse 就可以实现.

这里有开放源代码的JSON 解析器. 在执行 最小化 后, 还不到2.5K.

本文转载自:JavaScript中的JSON

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值