英文原文:http://www.json.org/js.html
JavaScript是一门通用编程语言,被作为页面脚本语言引入Netscape Navigator。它仍被广泛地认为是Java的一个子集,但它不是。它是一门有着类C语法和soft objects的类Scheme语言,JavaScript在ECMAScript Language Specification, Third Edition中被标准化。
JSON是JavaScript对象字面量表示法(object literal notation)的一个子集。因为JSON是JavaScript的一个子集,所以它可以毫不费力地被用在这门语言中。
1 2 3 4 5 6 |
|
在这个例子中,一个含有单个成员“bindings”的对象被创建,该成员包含一个含有三个对象的数组,每个对象含有“ircEvent”,“method”和“regex”三个成员。
成员可以通过点或下标运算符检索。
1
|
|
你可以使用eval函数将一段JSON文本转换成一个对象,eval函数会调用JavaScript编译器。因为JSON是JavaScript的一个真子集(a proper subset),编译器将正确地解析文本并产生一个对象结构。文本必须被包裹在括号内,以免在JavaScript的语法中的歧义上犯错误。
1
|
|
eval函数是非常快的。然而,它可以编译和执行任何JavaScript程序,所以可能会有安全问题。当源代码是可信的与合格的的时候才可以使用eval函数。使用JSON语法分析器则安全的多。在基于XMLHttpRequest的Web应用中,通讯只被允许朝着提供该页面的同源的方向,所以它是可信的。但它可能不是合格的。如果服务器在它的JSON编码里不是严格的,或者它没有严谨地验证所有的输入,然后它可能交付无效的JSON文本,它们可能携带危险的脚本。eval函数将会执行这些脚本,释放恶意。
为抵御这些,应该使用JSON语法分析器。JSON语法分析器将只识别JSON文本,拒绝所有的脚本。在提供本地JSON支持的浏览器里,JSON语法分析器也比eval快的多。预计本地JSON支持将会被包含在下一个ECMAScript标准中。
1
|
|
可选的reviver参数是一个函数,它会被最终结果的各个层面上的每个键和值调用。每个值会被reviver函数的返回结果替换。这可以被用来将通用对象改编成为伪类实例,或者被用来将date字符串转化成Date对象。
1 2 3 4 5 6 7 8 9 10 |
|
JSON stringifier则作相反的工作,它将JavaScript数据结构转换为JSON文本。JSON不支持循环的数据结构,所以注意不要把循环的结构交给JSON stringifier。
1
|
|
如果stringify方法看到一个对象包含toJSON方法,它会调用该方法,并字符串化返回的值。这允许一个对象去确定其自己的JSON表示。
stringify~~原文是stringifier,疑似拼错~~方法可以接受一个可选的字符串数组。这些字符串被用于选取那些将会被包含在JSON文本中的属性。
stringify~~原文是stringifier,疑似拼错~~方法可以接受一个可选的replacer函数。该函数会在结构中每个值的toJSON方法(如果有)之后被调用。它将每个键和值作为参数传递,并且this将会被绑定到持有键的对象上。返回的值会被字符串化。
没有在JSON中表示的值(例如函数和undefined)被排除在外。
非有限的数字被替换为null。要替换成其它的值,你可以使用像这样的replacer函数:
1 2 3 4 5 6 |
|
给JSON.parse一个相应的reviver可以还原这些。
The open source code of a JSON parser and JSON stringifier is available. When minified it is less than 2.5K.