Dojo
发布时间:2022-04-21 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了探索dojo/json,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Dojo长久以来一直通过dojo.fromJson()和dojo.toJson对JSON操作提供良好的
支持,但随着ECMAScript 5的JSON对象的出现及其API在浏览器中的普及,现在对JSON的解析和
生成操作都有了标准化的API。Dojo1.7新加入的@L_
450_14@模块遵循了这个标准,它使Dojo在浏览器原生JSON对象存在的时候直接交给浏览器来
生成或解析JSON。使
用这个原生JSON对象的速度更快,同时,dojo/json模块采用了集成到打包系统中的
功能检测系统(has() API),因此可以通过打包系统创建出针对某些浏览器的特殊包(例如移动设备包),这些包中的json模块将只有几字节。
使用dojo/json
要引入dojo/json模块,只需将其包含在依赖项列表中即可,就像加载其他模块一样:
define(["dojo/json"],function(JSON){
//变量JSON可用于JSON数据的解析或串行化
});
要解析@L_
450_14@JSON字符串,我们只需直接
调用parse()
方法:
define(["dojo/json"],function(JSON){
var someJsonString = getData();
// 解析JSON字符串
var myData = JSON.parse(someJsonString);
});
dojo/json的parse()
方法与dojo.fromJson()有一些细微的差别。这两个都能正确解析任何有效的JSON,然而,parse
方法最终会委托给原生的JSON解析器,这意味着你必须传给它格式上真正严格有效的JSON字符串才能保证正确的结果,
而另一方面,dojo.fromJson()一直使用eval()
方法来解析,因此它能接受任意有效的JavaScript表达式。为了保证向后兼容,dojo.fromJson()将仍然接受任意有效的JavaScript表达式,但dojo/json的parse()
方法只能接受严格有效的JSON。
保证安全严格的解析
如果原生JSON解析器不可用,dojo/json
默认会采用eval()
方法来解析JSON。一般而言这个
方法还是比较快的,但如果你需要解析来自非可信源的JSON,就应当使用严格模式(
Strict mod
E)。可以将parse()
方法的第二个参数设置为true来启用严格模式。例如:
var someJsonString = getData();
// 解析JSON字符串
var myData = JSON.parse(someJsonString,truE);
当原生JSON解析不可用时,严格模式解析会显得稍慢一些(这
是因为需
要做额外的检查)。而当原生JSON解析可用时,这第二个参数将被忽略,因为解析永远是严格的(而且一样快)。如下图所示,当原生解析不可用时,严格模式比非严格模式要慢2-3倍。原生解析的速度优势非常明显,因此dojo/json总是会优先
考虑使用原生解析,而不管是否设置了严格模式参数。dojo/fromJson()
函数从不使用原生解析,因此要比使用了原生解析的dojo/json慢3-4倍。
通常在服务器端采用安全措施要比在客户端更好,因此如果你从你自己的服务器
获取数据,最好在服务器端使用@L_
450_14@安全有效的JSON串行化工具,而不是依赖于客户端的安全检查。parse()
函数的严格模式应该只被用于来自非可信源的数据。
JSON串行化
dojo/json模块也可以用于串行化JSON。同样,这也是基于原生的JSON API,只要原生的JSON串行化
函数可用就会交给它完成。串行化很简单,只需要传递@L_
450_14@JavaScript对象、数组、或者原始值给dojo/json模块的
Stringify
函数:
define(["dojo/json"],function(JSON){
var object = {foo:"bar"};
// 串行化为JSON字符串
var serialized = JSON.Stringify(object); // 将返回'{"foo":"bar"}'
});
Stringify
方法还能接受@L_
450_14@
replacer
函数,可以用于对
自定义数据类型的串行化。例如我们可以通过这个
函数把日期数据串行化为UTC毫秒格式。另外,我们也可以用空格使串行化的数据具有易于阅读的缩进。要启
用这个易读模式,只需将空格作为第三个参数:
var object = {nested:{props:truE}};
// 串行化为JSON字符串
var serialized = JSON.Stringify(object,null," "); // 返回具有缩进格式的串行化对象
Stringify()
函数非常类似于以前的dojo.toJson()
函数,但还是有一些不同:
- dojo.fromJson()函数会在它遇到的每个对象中寻找json()或__json__()方法作为自定义的串行化方法,但Stringify()则会找toJson()方法。
- dojo.fromJson()函数不接受replacer函数作为参数,其第二个参数只是@L_450_14@布尔值,表示是否以美观的形式(缩进)输出结果。如果使用美观形式(传truE),就会使用dojo.toJsonIndentStr作为缩进字符串。
在无Base的Dojo中使用dojo/json
Dojo1.7和1.8设计成可以不需要完整的Dojo Base库就能打包应用。当Dojo Base在gzip后的大小小于40KB时,一些应用(尤其是移动设备上的应用)可能希望能做到
代码最小化。dojo/json模块是Dojo中不再需要Dojo Base的众多模块之一。这个模块只需要@L_
450_14@模块加载器就能运行,没有任何其他依赖项。这使得超轻量级的应用成为可能。可参
考
这篇博客文章进一步了解如何打造你自己的Dojo包。
小结
Dojo1.7和1.8中处理JSON的
方法:
- 解析来自于可信源的JSON —— 使用dojo/json的parse(str)方法
- 解析来自于非可信源的JSON —— 使用dojo/json的parse(str,truE)方法
- 解析来自可信源的JavaScript表达式(包含JSON)—— 使用dojo.fromJson(str)
- 将对象或原始值串行化为JSON —— 使用dojo/json的Stringify(value)方法。
- 以美观的缩进形式串行化对象或原始值 —— 使用dojo/json的Stringify(value," ")
在比较新的浏览器上(
包括所有近期版本的chrome、
Sarari、firefox、opera以及IE8或更高版本的IE),新的dojo/json模块与dojo.fromJson()/dojo.toJson()相比明显具有更好的
性能和更小的
代码量。
大佬总结
以上是大佬教程为你收集整理的探索dojo/json全部内容,希望文章能够帮你解决探索dojo/json所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。