http://bestiejs.github.io/json3/
JSON 3 显示了两个功能:stringify():序列化一个javaScript值为一个JSON,和parse():将一个json字符串转换成一个JavaScript对象.这是对JSON2的一个嵌入式替换.这个函数完全遵照ECMAScript的规范描述.除了日期的序列化差异.JSON3没有使用eval和正则表达式.这里在过时和移动的环境里提供了很好的安全性和性能优势.
对比JSON2 发生的改变:
json3...
1.正确的序列化原始包装对象。
2.序列化环状结构时,抛出一个TypeError(JSON2直到递归调用堆栈溢出)
3.利用功能测试,检测损坏的或不完整的原生JSON实现(JSON2只检查的本地函数的存在).测试只在运行时执行一次,所以有分析或序列化值时,没有额外的性能开销。
相反,对比JSON2,JSON3没有的是...
1.给Boolean, Number, and String 原型添加toJSON()方法.这些都不是任何标准的一部分,并且使 stringify()的设计实现变的多余.
2.给 Date.prototype添加toJSON() or toISOString()方法.具体查下下面的日期.
Date 序列化:
1.JSON3偏离规范的重要途径之一:它并没有定义Date#toISOString() 或者 Date#toJSON()方法.这里保留了一般JS的兼容性,同时避免了污染本来的原型(prototypes).相反的,date序列化是有stringify()实现内部执行的.如果一个date对象没有定义传统的toJSON()方法,它被序列化为一个简单iso 8601 日期字符串.
2.几个本地的Date#toJSON()方法生成日期时间字符串在规范上并不符合语法:例如,Safari4的所有版本以及JSON2,不能正确序列扩展的年.另外,JSON2和旧的实现省略了日期时间字符串毫秒.(在ES 5中是可选择的,在5.1中是必须要求的.)最后在 Safari 4和5的所有版本中,序列化一个无效的日期会产生一个"Invalid Date",而不是null;因为这些环境显示出其他序列化的错误,但是,JSON3将覆盖本地字符串化()实现。
使用:
页面展示:
<script src="//cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js"></script> <script> JSON.stringify({"Hello": 123}); // => ‘{"Hello":123}‘ JSON.parse("[[1, 2, 3], 1, 2, 3, 4]", function (key, value) { if (typeof value == "number") { value = value % 2 ? "Odd" : "Even"; } return value; }); // => [["Odd", "Even", "Odd"], "Odd", "Even", "Odd", "Even"] </script>
当在web浏览器中使用时,JSON3公开了一个额外的JSON3对象包含noConfict()和renlnContext()函数,以及别名以stringify()和parse()函数.
noConfict()和renlnContext()函数:
.JSON3.noConflict() 还原全局JSON对象的原始值,返回一个引用JSON3对象
.JSON3.runInContext([context, exports])使用给定上下文对象初始化JSON3,(e.g., window, global, etc.), 或全局对象,如果忽略.如果指定了出口对象,stringify(), parse(), 和 runInContext() 函数将会附着它来代替一个新的对象.
异步模块装载机:
JSON3 被定义为一个匿名模块兼容RequireJS.js,curl.js和其他异步模块加载机.
<script src="//cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.js"></script> <script> require({ "paths": { "json3": "./path/to/json3" } }, ["json3"], function (JSON) { JSON.parse("[1, 2, 3]"); // => [1, 2, 3] }); </script>
为了避免与第三方脚本的问题,JSON3导出到全局范围,即使在模块加载器中使用.如果这种行为是不希望的,JSON3.noConflict()可用于全局JSON对象恢复到其原始值。
注:如果您打算使用JSON3旁边另一个模块,请不要简单地串连这些模块组合在一起,因为这将导致一个脚本重复定义调用,导致AMD装载机的错误。如果你需要为生产环境压缩文件,那么可以使用r.js来处理优化.
CommonJS 环境:
var JSON3 = require("./path/to/json3");
JSON3.parse("[1, 2, 3]");
// => [1, 2, 3]
JavaScript 引擎:
load("path/to/json3.js");
JSON.stringify({"Hello": 123, "Good-bye": 456}, ["Hello"], "\t");
// => ‘{\n\t"Hello": 123\n}‘
兼容性:
JSON3已经在web浏览器,CommonJS环境和JavaScript引擎.
Web浏览器:
1.IE6.0或者更高版本
2.火狐1.0版本或者更高
3.Safari2.0版本或者更高
4.Opera7.02版本或者更高
5.Mozilia1.0,Netscape6.2.3,SeaMonkey1.0或者更高版本.
CommonJS环境:
1.Node0.2.6或者更高版本
2.RinqoJS0.4或者更高版本
3.Narwhal0.3.2或者更高版本
JavaScript引擎:
1.Mozilia Rhino1.5R5或者更高版本
2.WebKitJSC
3.Google V8
已知的不兼容:
试图序列化参数对象可能会跨环境产生不一致的结果,由于规范版本的差异.作为一种变通方法,请首先转换参数对象到一个数组:JSON.stringify([].slice.call(arguments, 0)).
所需的本地方法:
JSON3假设下面的方法存在,并且和ECMAScript规范中的功能描述一样.
The Number, String, Array, Object, Date, SyntaxError, and TypeError constructors.
String.fromCharCode
Object#toString
Function#call
Math.floor
Number#toString
Date#valueOf
String.prototype: indexOf, charCodeAt, charAt, slice.
Array.prototype: push, pop, join.