探索dojo/json

article/2025/9/13 5:34:09
难度:中等
Dojo版本:1.7+
原作者:Kris Zyp
译者:Oliver (zhuxw1984@gmail.com)
原文链接:http://www.sitepen.com/blog/2012/09/21/exploring-dojojson/

(年初翻译过Kris Zyp的另一篇介绍dojo/json的文章: Dojo的内建JSON解析模块,本文相比那篇文章更为详细,着重介绍了新老API的对比,对一些API的特殊用法也解释得比较清楚。——译者注)

Dojo长久以来一直通过dojo.fromJson()和dojo.toJson对JSON操作提供良好的支持,但随着ECMAScript 5的JSON对象的出现及其API在浏览器中的普及,现在对JSON的解析和生成操作都有了标准化的API。Dojo1.7新加入的一个模块遵循了这个标准,它使Dojo在浏览器原生JSON对象存在的时候直接交给浏览器来生成或解析JSON。使用这个原生JSON对象的速度更快,同时,dojo/json模块采用了集成到打包系统中的功能检测系统(has() API),因此可以通过打包系统创建出针对某些浏览器的特殊包(例如移动设备包),这些包中的json模块将只有几字节。

使用dojo/json

要引入dojo/json模块,只需将其包含在依赖项列表中即可,就像加载其他模块一样:
define(["dojo/json"], function(JSON){//变量JSON可用于JSON数据的解析或串行化
});
要解析一个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 mode)。可以将parse()方法的第二个参数设置为true来启用严格模式。例如:
var someJsonString = getData();
// 解析JSON字符串
var myData = JSON.parse(someJsonString, true);
当原生JSON解析不可用时,严格模式解析会显得稍慢一些(这是因为需要做额外的检查)。而当原生JSON解析可用时,这第二个参数将被忽略,因为解析永远是严格的(而且一样快)。如下图所示,当原生解析不可用时,严格模式比非严格模式要慢2-3倍。原生解析的速度优势非常明显,因此dojo/json总是会优先考虑使用原生解析,而不管是否设置了严格模式参数。dojo/fromJson()函数从不使用原生解析,因此要比使用了原生解析的dojo/json慢3-4倍。
性能分析图
通常在服务器端采用安全措施要比在客户端更好,因此如果你从你自己的服务器获取数据,最好在服务器端使用一个安全有效的JSON串行化工具,而不是依赖于客户端的安全检查。parse()函数的严格模式应该只被用于来自非可信源的数据。

JSON串行化

dojo/json模块也可以用于串行化JSON。同样,这也是基于原生的JSON API,只要原生的JSON串行化函数可用就会交给它完成。串行化很简单,只需要传递一个JavaScript对象、数组、或者原始值给dojo/json模块的stringify函数:
define(["dojo/json"], function(JSON){var object = {foo:"bar"};// 串行化为JSON字符串var serialized = JSON.stringify(object); // 将返回'{"foo":"bar"}'
});
stringify方法还能接受一个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函数作为参数,其第二个参数只是一个布尔值,表示是否以美观的形式(缩进)输出结果。如果使用美观形式(传true),就会使用dojo.toJsonIndentStr作为缩进字符串。

在无Base的Dojo中使用dojo/json

Dojo1.7和1.8设计成可以不需要完整的Dojo Base库就能打包应用。当Dojo Base在gzip后的大小小于40KB时,一些应用(尤其是移动设备上的应用)可能希望能做到代码最小化。dojo/json模块是Dojo中不再需要Dojo Base的众多模块之一。这个模块只需要一个模块加载器就能运行,没有任何其他依赖项。这使得超轻量级的应用成为可能。可参考 这篇博客文章进一步了解如何打造你自己的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()相比明显具有更好的性能和更小的代码量。

http://chatgpt.dhexx.cn/article/V5xUhryd.shtml

相关文章

dojo是什么?

现在Web端vue、React、Angular大行其道,安卓端js也有React Native等,那么学习dojo有什么意义呢? 有些老的项目还是用的dojo。。。。例如arcgis javascript api等等 https://dojotoolkit.org/documentation/tutorials/1.10/hello_dojo/ 为什…

Dojo入门篇

Dojo是一个JavaScript实现的开源DHTML工具包,Dojo最初的目标是解决开发HTML应用程序中遇到的一些长期存在的问题,然而现在Dojo已经成为了开发RIA应用程序的利器。 Dojo让Web页面具有动态能力,我们可以在其他支持JavaScript的环境中使用Dojo。…

dojo中的类

使用arcgis api for js 4.*进行地图的web前端开发,就不得不与dojo打交道。dojo是一个框架,自成体系,比如它对类的支持,有自己的一套。众所周知,js不是面向对象语言,没有类这一说,都是用函数来模…

dojo学习教程

Dojo 作为最著名的 Ajax 开源项目之一,不仅让 Web 程序员可以免费获得和使用其框架进行 Web 应用的开发,更吸引了大量的开发者对其不断的扩充,开发新的组件。DojoX 就是在这样的开发社区中产生的。DojoX 是一组基于 dojo 的开源项目的集合&am…

Dojo与jQuery综合比较分析

最近Dojo和jQuery双双发布了最新的1.8版本,有着相同版本号的两个Javascript库也有许多核心的相同之处:相同的资源加载机制AMD、相同的选择器 引擎Sizzle等。作为业界知名的Javascript库,Dojo和jQuery在各自领域有着为数众多的拥护者。不过正所谓一把钥匙开一把锁,对一个项目…

Dojo简述

Dojo是一个JavaScript实现的开源DHTML工具包。Dojo的最初目标是解决开发DHTML应用程序时遇到的一些长期存在的历史问题。 【注:DHTML是一种使HTML页面具有动态特性的艺术。DHTML是一种创建动态和交互WEB站点的技术集合。对大多数人来说,DHTML意味着HTML…

ibatis简介

背景 介绍ibatis实现之前,先来看一段jdbc代码: Class.forName("com.mysql.jdbc.Driver"); String url "jdbc:mysql://localhost:3306/learnworld"; Connection con DriverManager.getConnection(url, "root","learnwo…

Ibatis使用

部分参考:https://blog.csdn.net/shixiaoguo90/article/details/49949445 Apache iBatis是当前IT项目中使用很广泛的一个半自动ORM框架,区别于Hibernate之类的全自动框架,iBatis对数据库的操作拥有更加灵活的控制,对于那些经常需…

iBatis-iBatis配置环境(eclipse+mysql)

在使用JAVA框架前要配置其环境,比如使用Hibernate、Struts等都需要对其环境进行配置,当然使用iBatis开发之前,也需要配置iBatis环境。 一、iBatis环境的配置只需三步 1.引入jar包 2.配置sqlMapConfig.xml文件 3.配置SqlMap.xml文件 二、概览i…

什么是IBatis

什么是IBatis 我一直想写一篇关于持久化数据访问的文章,可是我不知道怎么开始介绍,前两天晚上睡觉的时候突然有了一些开始写的想法,所以我决定今天动手开始写一点东西。头一次写这样的文章,希望大家不要见怪。 现在网上很多人学习…

ibatis-Spring 整合

这两天一直在研究ibatis与spring的整合 一个小小的demo搞的我头晕目眩的,但程序一旦跑起来了,突然有一种豁然开朗,重见天日,感觉生活很美好的感觉!,也许,这就是那一行行的代码带给我们的不同享受…

ibatis与spring整合

这两天一直在研究ibatis与spring的整合 一个小小的demo搞的我头晕目眩的,但程序一旦跑起来了,突然有一种豁然开朗,重见天日,感觉生活很美好的感觉!,也许,这就是那一行行的代码带给我们的不同享受…

iBatis--iBatis 是什么?

一.为啥使用iBatis? 在 Hibernate、JPA 这样的一站式对象 / 关系映射(O/R Mapping)解决方案盛行之前,iBaits 基本是持久层框架的不二选择。即使在持久层框架层出不穷的今天,iBatis 凭借着易学易用、轻巧灵活等特点&am…

iBatis-iBatis基本操作(增删改查)

在上一篇iBatis博客中已介绍了如何配置iBatis环境,这篇博客主要进行介绍一些iBatis的基本操作实现。iBatis的增删改操作都需要操作SqlMap,DAO层Manger,POJO 这几个类来实现。下面分别介绍一下iBatis基本操作的实现: 一.iBatis的添加数据方式 这里介绍两种iBatis添加…

Ibatis与Mybatis的区别—侧重于Ibatis

目录 一、什么是Ibatis? 1、iBatis是一款轻量级的持久化框架 2、iBatis最大的特点是将SQL语句与Java代码分离 3、iBatis具有以下几个关键组成部分: 二、Ibatis与Mybatis的区别 1、基本信息不同 2、开发时间不同 3、配置方法不同 三、Ibatis与My…

ibatis使用方法

转载。怕原地址丢失,备份。。 http://lyb520320.iteye.com/blog/586628 http://lyb520320.iteye.com/blog/586800 iBATIS3.0学习(一)使用iBATIS3.0完成增删改查 博客分类: iBATIS3 iBATIS Apache Spring SQL JDBC 使用iBATIS3.0完…

IBatis使用浅析

ibatis 历史 Eight years ago in 2002, I created the iBATIS Data Mapper and introduced SQL Mapping as an approach to persistence layer development. Shortly thereafter, I donated the iBATIS name and code to the Apache Software Foundation. The ASF has been th…

IBatis的使用

IBatis的使用 1、IBatis是什么 回顾之前前端访问后端的整个流程: View ------ >Controller --------> Service ---------> DAO ------> 数据库 View :前端jsp/HTML Controller:Servlet/SpringMVC Service :Spring DAO&…

IBatis——初步总结

IBatis是持久层的框架,也就是我们说的Dao层框架,关注数据库操作以及和Java对象之间的关联,我们将这样的框架也称之为ORM(Object/Relaction Mapping)框架.而这里映射的主要是我们的表和实体(bean&#xff09…

XMind导入Markdown(利用Typora导出opml)

安装Xmind XMind 是一款非常实用的商业思维导图软件 首先,安装Xmind并打开。通过"帮助"——>“关于Xmind”,可以获取到当前的版本号为 XMind 8 Update 9 在"文件"——>“导入”,可以看到Xmind支持的导入格式仅有…