JSON

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

修订内容

JSON (JavaScript Object Notation)是一种数据交换格式.  It closely resembles a subset of JavaScript syntax, although it is not a strict subset. (See JSON in the JavaScript Reference for full details.)  It is useful when writing any kind of JavaScript-based application, including websites and browser extensions.  For example, you might store user information in JSON format in a cookie, or you might store extension preferences in JSON in a string-valued browser preference.

JSON is capable of representing numbers, booleans, strings, null, and arrays (ordered sequences of values) and objects (string-value mappings) composed of these values (or of other arrays and objects).  It doesn't natively represent more complex data types like functions, regular expressions, dates, and so on.  (Date objects by default serialize as a string containing the date in ISO format, so while they don't round-trip, the information isn't completely lost.)  If you need to preserve such values, you can transform values as they are serialized, or prior to deserialization, to enable JSON to represent additional data types.

使用原生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 object.

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这些类型.

正因为对比原生JSON对象,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数据

 which is very likely to break code not specifically anticipating that possibility. 

虽然在理论上,你可以使用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>)是一种数据交换格式.  It closely resembles a subset of <a href="/zh-cn/JavaScript" title="zh-cn/JavaScript">JavaScript</a> syntax, although it is not a strict subset. (See <a href="/zh-cn/JavaScript/Reference/Global_Objects/JSON" title="zh-cn/JavaScript/Reference/Global Objects/JSON">JSON</a> in the <a href="/zh-cn/JavaScript/Reference" title="zh-cn/JavaScript/Reference">JavaScript Reference</a> for full details.)  It is useful when writing any kind of JavaScript-based application, including websites and browser extensions.  For example, you might store user information in JSON format in a <a href="/zh-cn/DOM/document.cookie" title="zh-cn/document.cookie">cookie</a>, or you might store extension preferences in JSON in a string-valued browser preference.</p>
<p>JSON is capable of representing numbers, booleans, strings, <code>null</code>, and arrays (ordered sequences of values) and objects (string-value mappings) composed of these values (or of other arrays and objects).  It doesn't natively represent more complex data types like functions, regular expressions, dates, and so on.  (Date objects by default serialize as a string containing the date in ISO format, so while they don't round-trip, the information isn't completely lost.)  If you need to preserve such values, you can transform values as they are serialized, or prior to deserialization, to enable JSON to represent additional data types.</p>
<h2 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 object</a>.</p><h2>toJSON() 方法</h2>
<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>
<h2>限制</h2>
<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>使用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>正因为对比原生JSON对象,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 name="Using_JSON">其他方法处理JSON数据</h2>
<p> which is very likely to break code not specifically anticipating that possibility. </p>
<p>虽然在理论上,你可以使用eval来处理JSON数据(只能反序列化JSON字符串为JavaScript对象,而不能将JavaScript对象序列化为JSON字符串),或使用json2.js,但这不是一个好主意.使用eval来解析JSON字符串是不安全的,因为eval允许解析很多原生JSON对象不允许解析的语法,比如说对任意代码的执行语句.就json2.js来说,它的问题是,它为一些内置对象添加了扩展方法,比如<code>Object.prototype</code>,这是极有可能打破代码没有特别期待这种可能性的方法.你应该尽可能的使用前面介绍的两个处理JSON的标准方法。</p>
<h3 name="See_also">相关链接</h3>
<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>
<h3>工具</h3>
<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>
恢复到这个版本