JSON3-翻译(不当之处,请指正)

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"], " ");
// => '{ "Hello": 123 }'


兼容性:
    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.

原文地址:https://www.cnblogs.com/a198720/p/4176671.html