版本 31818 / JSON

  • 版本网址缩略名: JSON
  • 版本标题: JSON
  • 版本 id: 31818
  • 创建于:
  • 创建者: ziyunfei
  • 是否是当前版本?
  • 评论 27 words added, 22 words removed

修订内容

JSON (JavaScript Object Notation)是一种数据交换格式.它的语法很接近于JavaScript语法的一个子集,虽然不是一个严格的子集. 但这对编写任何一种基于JavaScript的应用程序来说,是很有益处的.包括网站和浏览器扩展.例如,你可以很容易的把一个包含用户信息的JavaScript对象以JSON格式存储在cookie里,或者你可以将一个浏览器扩展的配置以JSON格式存储在浏览器个人偏好(prefs.js)里.

在JavaScript中,JSON格式的字符串可以和下列类型的值互相转换:数字,布尔值,字符串,null,数组(值的有序序列),对象(键值映射). JSON本身不支持其他更复杂的数据类型,例如函数,正则表达式,Date对象等(Date对象可以被序列化成为一个包含对应日期的字符串,但该字符串不能再转换回原来的Date对象 ).如果你需要保留这些JSON不支持转换的类型的值,你可以在它们被序列化或反序列化之前,进行格式转换,从而使JSON支持这些数据类型的值.

使用原生JSON对象处理JSON数据

处理JSON数据最简单,最易用的方法就是使用JavaScript中标准的原生JSON对象. 使用 JSON.stringify方法将一个JavaScript对象序列化为JSON格式的字符串, 使用 JSON.parse 方法来把一个JSON格式的字符串反序列化为一个JavaScript对象.

下例使用JSON.stringify()方法来序列化一个JavaScript对象:

var foo = {};
foo.bar = "new property";
foo.baz = 3;

var JSONfoo = JSON.stringify(foo);

字符串JSONfoo现在的值为{"bar":"new property","baz":3}. 将JSONfoo的值还原为一个JavaScript对象,使用如下方法:

var backToJS = JSON.parse(JSONfoo);

想要了解更多关于JavaScript原生JSON对象的知识,请查看 JSON对象.

toJSON() 方法

如果一个对象拥有 toJSON() 方法,则 JSON.stringify 方法会根据该对象的toJSON方法的返回值来决定自己返回的JSON字符串的值.如下例所示:

var x = {}; 
x.foo = "foo";  
x.toJSON = function() { return "bar"; }; 
var json = JSON.stringify(x); 

json 的值为 "bar".

限制

由于JSON规范的限制,如果一个对象存在属性值为函数的属性,则在对该对象进行序列化时.这个属性将不会被遍历到.如下例所示:

var x = {};
x.foo = "foo";  
x.bar = function(){alert('bar');};  
var json = JSON.stringify(x); 

json 的值为 {"foo":"foo"}.

使用nsIJSON处理JSON数据

Firefox 3.5之前不支持原生的JSON对象,处理JSON数据的唯一方法就是通过nsIJSON组件(Firefox 3以上可用). 对JSON数据进行编码解码得通过nsIJSON组件的encode以及 decode方法.但是这些方法的功能没有如今原生的JSON对象强大,它们仅支持对Object和Array类型的值进行转换,不支持 String, Boolean, Number, null这些类型.

正因为如此,nsIJSON组件显得有点多余, 所以从Firefox 7开始,nsIJSON组件的encode和decode方法已被删除.开发者应当使用原生的JSON对象来代替它们.

下面的代码使用了nsIJSON来对一个JavaScript对象进行序列化:

var Ci = Components.interfaces;
var Cc = Components.classes;

var foo = {};
foo.bar = "new property";
foo.baz = 3;

var nativeJSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
var JSONfoo = nativeJSON.encode(foo);

JSONfoo变量的值为一个JSON格式的字符串{"bar":"new property","baz":3}. 将JSONfoo中的字符串还原为一个JavaScript对象,使用如下方法:

var backToJS = nativeJSON.decode(JSONfoo);

其他方法处理JSON数据

虽然在理论上,你可以使用eval来处理JSON数据(只能反序列化JSON字符串为JavaScript对象,而不能将JavaScript对象序列化为JSON字符串),或使用json2.js,但这都不是一个好主意.使用eval来解析JSON字符串是不安全的,因为eval允许解析很多原生JSON对象不允许解析的语法,比如说对任意代码的执行语句.就json2.js来说,它的问题是,它为一些内置对象添加了扩展方法,比如Object.prototype,这极有可能扰乱其他代码的正常运行(比如遍历对象时,会多出一个继承于原型的属性).你应该尽可能的使用前面介绍的两个处理JSON的标准方法。

相关链接

工具

{{ languages( { "ja": "ja/JSON", "en": "en/JSON" } ) }}

修订版来源

<p><strong>JSON</strong> (<strong>JavaScript Object Notation</strong>)是一种数据交换格式.它的语法很接近于JavaScript语法的一个子集,虽然不是一个严格的子集. 但这对编写任何一种基于JavaScript的应用程序来说,是很有益处的.包括网站和浏览器扩展.例如,你可以很容易的把一个包含用户信息的JavaScript对象以JSON格式存储在cookie里,或者你可以将一个浏览器扩展的配置以JSON格式存储在浏览器个人偏好(prefs.js)里.</p>
<p>在JavaScript中,JSON格式的字符串可以和下列类型的值互相转换:数字,布尔值,字符串,<code>null</code>,数组(值的有序序列),对象(键值映射). JSON本身不支持其他更复杂的数据类型,例如函数,正则表达式,Date对象等(Date对象可以被序列化成为一个包含对应日期的字符串,但该字符串不能再转换回原来的Date对象 ).如果你需要保留这些JSON不支持转换的类型的值,你可以在它们被序列化或反序列化之前,进行格式转换,从而使JSON支持这些数据类型的值.</p>
<h2 id="JSON_in_Firefox_2" name="JSON_in_Firefox_2">使用原生JSON对象处理JSON数据</h2>
<p>处理JSON数据最简单,最易用的方法就是使用JavaScript中标准的原生<a href="/zh-cn/JavaScript/Reference/Global_Objects/JSON" title="zh-cn/JavaScript/Reference/Global Objects/JSON">JSON对象</a>. 使用 <a href="/zh-cn/JavaScript/Reference/Global_Objects/JSON/stringify" title="zh-cn/JavaScript/Reference/Global Objects/JSON/stringify">JSON.stringify</a>方法将一个JavaScript对象序列化为JSON格式的字符串, 使用 <a href="/zh-cn/JavaScript/Reference/Global_Objects/JSON/parse" title="zh-cn/JavaScript/Reference/Global Objects/JSON/parse">JSON.parse</a> 方法来把一个JSON格式的字符串反序列化为一个JavaScript对象.</p>
<p>下例使用<code>JSON.stringify()</code>方法来序列化一个JavaScript对象:</p>
<pre class="brush: js">var foo = {};
foo.bar = "new property";
foo.baz = 3;

var JSONfoo = JSON.stringify(foo);
</pre>
<p><code>字符串JSONfoo</code><code>现在的值为{"bar":"new property","baz":3}</code>. 将<code>JSONfoo</code>的值还原为一个JavaScript对象,使用如下方法:</p>
<pre class="brush: js">var backToJS = JSON.parse(JSONfoo);
</pre>
<p>想要了解更多关于JavaScript原生JSON对象的知识,请查看 <a href="/zh-cn/JavaScript/Reference/Global_Objects/JSON" title="zh-cn/JavaScript/Reference/Global Objects/JSON">JSON对象</a>.</p>
<h3 id="toJSON()_方法">toJSON() 方法</h3>
<p>如果一个对象拥有 toJSON() 方法,则 JSON.stringify 方法会根据该对象的toJSON方法的返回值来决定自己返回的JSON字符串的值.如下例所示:</p>
<pre class="brush: js">var x = {}; 
x.foo = "foo";  
x.toJSON = function() { return "bar"; }; 
var json = JSON.stringify(x); 
</pre>
<p><code>json</code> 的值为 "bar".</p>
<h3 id="限制">限制</h3>
<p>由于JSON规范的限制,如果一个对象存在属性值为函数的属性,则在对该对象进行序列化时.这个属性将不会被遍历到.如下例所示:</p>
<pre class="brush: js">var x = {};
x.foo = "foo";  
x.bar = function(){alert('bar');};  
var json = JSON.stringify(x); 
</pre>
<p><code>json</code> 的值为 {"foo":"foo"}.</p>
<h2 id="使用nsIJSON处理JSON数据">使用nsIJSON处理JSON数据</h2>
<p>Firefox 3.5之前不支持原生的JSON对象,处理JSON数据的唯一方法就是通过<code><a href="/zh-cn/XPCOM_Interface_Reference/nsIJSON" title="zh-cn/nsIJSON">nsIJSON</a></code>组件(Firefox 3以上可用). 对JSON数据进行编码解码得通过<code>nsIJSON</code>组件的<code>encode</code>以及 <code>decode</code>方法.但是这些方法的功能没有如今原生的JSON对象强大,它们仅支持对Object和Array类型的值进行转换,不支持 String, Boolean, Number, <code>null这些类型</code>.</p>
<p>正因为如此,nsIJSON组件显得有点多余, 所以从Firefox 7开始,nsIJSON组件的encode和decode方法已被删除.开发者应当使用原生的JSON对象来代替它们.</p>
<p>下面的代码使用了<code>nsIJSON</code>来对一个JavaScript对象进行序列化:</p>
<pre class="brush: js">var Ci = Components.interfaces;
var Cc = Components.classes;

var foo = {};
foo.bar = "new property";
foo.baz = 3;

var nativeJSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
var JSONfoo = nativeJSON.encode(foo);
</pre>
<p><code>JSONfoo</code>变量的值为一个JSON格式的字符串<code>{"bar":"new property","baz":3}</code>. 将<code>JSONfoo中的字符串还原为一个JavaScript对象</code>,使用如下方法:</p>
<pre class="brush: js">var backToJS = nativeJSON.decode(JSONfoo);
</pre>
<h2 id="Using_JSON" name="Using_JSON">其他方法处理JSON数据</h2>
<p>虽然在理论上,你可以使用eval来处理JSON数据(只能反序列化JSON字符串为JavaScript对象,而不能将JavaScript对象序列化为JSON字符串),或使用json2.js,但这都不是一个好主意.使用eval来解析JSON字符串是不安全的,因为eval允许解析很多原生JSON对象不允许解析的语法,比如说对任意代码的执行语句.就json2.js来说,它的问题是,它为一些内置对象添加了扩展方法,比如<code>Object.prototype</code>,这极有可能扰乱其他代码的正常运行(比如遍历对象时,会多出一个继承于原型的属性).你应该尽可能的使用前面介绍的两个处理JSON的标准方法。</p>
<h2 id="See_also" name="See_also">相关链接</h2>
<ul> <li><a href="/zh-cn/JSON/JSONPath" title="zh-cn/JSON/JSONPath">JSONPath</a></li> <li><a class="internal" href="/zh-cn/Using_native_JSON" title="/zh-cn/Using JSON in Firefox">Using JSON in Firefox</a></li> <li>{{ interface("nsIJSON") }}</li>
</ul>
<h2 id="工具">工具</h2>
<ul> <li><a class="external" href="http://jsonselect.org" title="http://jsonselect.org/">JSONSelect</a></li>
</ul>
<p>{{ languages( { "ja": "ja/JSON", "en": "en/JSON" } ) }}</p>
恢复到这个版本