1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
---
title: ネイティブ JSON を使う
slug: Using_native_JSON
translation_of: Web/JavaScript/Reference/Global_Objects/JSON
translation_of_original: Web/JavaScript/Guide/Using_native_JSON
---
<div>{{gecko_minversion_header("1.9.1")}}</div>
<p>この文書では、 Gecko 1.9.1 で追加された ECMAScript 5 互換のネイティブ JSON オブジェクトについて説明します。以前のバージョンの Firefox で JSON を扱う際の基本的な情報については、<a href="/ja/docs/JSON" title="JSON">JSON</a> のページをご覧下さい。</p>
<p>ネイティブ JSON オブジェクトは 2 つの重要なメソッドをもっています。<code>JSON.parse()</code> メソッドは JSON 文字列をパースし、 JavaScript のオブジェクトに変換します。<code>JSON.stringify()</code> メソッドは、 JavaScript オブジェクトを JSON 文字列に変換します。</p>
<div class="note"><strong>注意:</strong>JSON オブジェクトは循環的な構造の変換には対応していません。そのようなオブジェクトを JSON 文字列に変換しようとすると、<code>TypeError</code> 例外が起こります。</div>
<h2 id="JSON_.E6.96.87.E5.AD.97.E5.88.97.E3.81.AE.E3.83.91.E3.83.BC.E3.82.B9" name="JSON_.E6.96.87.E5.AD.97.E5.88.97.E3.81.AE.E3.83.91.E3.83.BC.E3.82.B9">JSON 文字列のパース</h2>
<p>JSON 文字列を JavaScript オブジェクトに変換するには、以下の例のように JSON 文字列を単純に <code>JSON.parse()</code> に渡すだけで済みます。</p>
<pre class="brush: js">var jsObject = JSON.parse(jsonString);
</pre>
<p>JavaScript 1.8.5 (Firefox 4) 以降では <code>JSON.parse()</code> では末尾のカンマを許可しません。</p>
<pre>// JavaScript 1.8.5 ではいずれも構文エラーとなります
var jsObject = JSON.parse("[1, 2, 3, 4, ]");
var jsObject = JSON.parse("{ \"foo\" : 1, }");
</pre>
<h2 id=".E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88.E3.82.92_JSON_.E3.81.AB.E5.A4.89.E6.8F.9B" name=".E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88.E3.82.92_JSON_.E3.81.AB.E5.A4.89.E6.8F.9B">オブジェクトを JSON に変換</h2>
<p>JavaScript オブジェクトを JSON 文字列に変換するには、オブジェクトを<code>JSON.stringify()</code> メソッドに渡します:</p>
<pre class="brush: js">var foo = {};
foo.bar = "new property";
foo.baz = 3;
var jsonString = JSON.stringify(foo);
</pre>
<p><code>jsString</code>は<code>'{"bar":"new property","baz":3}'</code> と変換されます。</p>
<p>Firefox 3.5.4 以降では <code>JSON.stringify()</code> オプションの引数で挙動をカスタマイズ可能になります。構文は次の通りです:</p>
<p><code>jsonString = JSON.stringify(<em>value</em> [, <em>replacer</em> [, <em>space</em>]])</code></p>
<dl>
<dt><code>value</code></dt>
<dd>JSON 文字列に変換する JavaScript オブジェクト。</dd>
<dt><code>replacer</code></dt>
<dd>文字列化プロセスの振る舞いを変更する関数、または value オブジェクトのプロパティのうち JSON 文字列出力に含めるホワイトリストを指定する <a href="/ja/docs/Web/JavaScript/Guide/Obsolete_Pages/Predefined_Core_Objects#String_.E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88" title="JavaScript/Guide/Predefined Core Objects/String Object"><code>String</code></a> もしくは <a href="/ja/docs/Web/JavaScript/Reference/Global_Objects/Number" title="JavaScript/ Reference/Global Objects/Number"><code>Number</code></a> オブジェクトの配列。この値が null もしくは指定されなかった場合、オブジェクトのすべてのプロパティが JSON 文字列の出力に含まれます。</dd>
<dt><code>space</code></dt>
<dd>出力される JSON 文字列を読みやすくするために挿入する空白文字を指定する <a href="/ja/docs/Web/JavaScript/Guide/Obsolete_Pages/Predefined_Core_Objects#String_.E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88" title="JavaScript/ Guide/Predefined Core
Objects/String Object"><code>String</code></a> もしくは <a href="/ja/docs/Web/JavaScript/Reference/Global_Objects/Number" title="JavaScript/ Reference/Global
Objects/Number"><code>Number</code></a> オブジェクト。<code>Number </code>が指定された場合、ホワイトスペースの空白文字数として扱われます。但し 10 を超える数値を指定しても 10 を指定したものとして扱われます。1 より小さい値を指定するとホワイトスペースは含められません。<code>String </code>が指定された場合、空白文字の代わりにその文字列(または 10 文字を越える場合は最初の 10 文字)が使われます。この値が<code> null </code>もしくは指定されなかった場合、ホワイトスペースは含まれません。</dd>
</dl>
<h3 id="replacer_.E3.83.91.E3.83.A9.E3.83.A1.E3.83.BC.E3.82.BF" name="replacer_.E3.83.91.E3.83.A9.E3.83.A1.E3.83.BC.E3.82.BF">replacer パラメータ</h3>
<p><code>replacer </code>パラメータには関数または配列を指定できます。</p>
<p><code>replacer </code>が関数である場合、文字列化するプロパティのキーと値二つをパラメータとして受け取ります。キーが見つかったオブジェクトは <code>this</code> パラメータとして渡されます。最初空文字列をキー、<code>value</code> パラメータのオブジェクトを値として関数を呼び出します。関数の返り値がオブジェクト(もしくは配列)であれば順次そのプロパティの名前と値を引数として関数を呼び出します。出力される JSON 文字列は関数の返値に応じて次のようになります:</p>
<ul>
<li><a href="/ja/docs/Web/JavaScript/Reference/Global_Objects/Number" title="JavaScript/ Reference/Global Objects/Number"><code>Number</code></a> が返されると、プロパティの値としてその数値に対応する文字列が JSON 文字列に出力されます。</li>
<li><a href="/ja/docs/Web/JavaScript/Guide/Obsolete_Pages/Predefined_Core_Objects#String_.E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88" title="JavaScript/ Guide/Predefined Core Objects/String"><code>String</code></a> が返されると、プロパティの値としてその文字列が JSON 文字列に出力されます。</li>
<li><a href="/ja/docs/Web/JavaScript/Reference/Global_Objects/Boolean" title="JavaScript/ Reference/Global Objects/Boolean"><code>Boolean</code></a> が返されると、プロパティの値として "true" もしくは "false" が JSON 文字列に出力されます。</li>
<li>その他のオブジェクトが返されると、各プロパティについて <code>replacer</code> を呼び出し、再帰的に JSON 文字列化されます。但し関数が返された場合には JSON 文字列には何も追加されません。</li>
<li><code>undefined</code> が返されると、プロパティは JSON 文字列の出力に含められません。</li>
</ul>
<div class="note"><strong>注記:</strong> 配列の要素を除外するためには <code>replacer</code> は使えません。オブジェクトのプロパティについては <code>undefined</code> または関数を返すとそのプロパティがスキップされますが、関数の要素の場合は <code>null</code> が出力されます。</div>
<h4 id="Example" name="Example">例</h4>
<pre class="eval deki-transform brush: js">function replacer(key, value) {
if (typeof value === "string") {
return undefined;
}
return value;
}
var foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7};
var jsonString = JSON.stringify(foo, replacer);
</pre>
<p>結果として得られる JSON 文字列は <code>{"week":45,"month":7}</code> となります。</p>
<p><code>replacer</code> が配列である場合、オブジェクトのプロパティのうち JSON 文字列出力に含まれるべきプロパティ名のリストとして扱われます。</p>
<h2 id="See_also" name="See_also">参考文献</h2>
<ul>
<li><a class="internal" href="/ja/docs/Web/JavaScript/ECMAScript_5_support_in_Mozilla" title="JavaScript/ECMAScript 5 support in Mozilla">Mozilla における ECMAScript 5 のサポート</a></li>
<li><a class="internal" href="/ja/docs/JSON" title="JSON">JSON</a></li>
</ul>
|