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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
---
title: JSON
slug: Web/JavaScript/Reference/Global_Objects/JSON
tags:
- JSON
- JavaScript
- Namespace
- Object
- Reference
- 名前空間
translation_of: Web/JavaScript/Reference/Global_Objects/JSON
---
<div>{{JSRef}}</div>
<p><span class="seoSummary"><strong><code>JSON</code></strong> オブジェクトは、 <a class="external" href="https://json.org/">JavaScript Object Notation</a> ({{glossary("JSON")}}) をパースするメソッドや、値を JSON に変換するメソッドを持ちます。これは呼び出しや構築をすることができず、また2つのメソッドプロパティを除いて、それ自身に興味深い機能性はありません。</span></p>
<h2 id="JavaScript_と_JSON_の違い">JavaScript と JSON の違い</h2>
<p>JSON は、オブジェクト、配列、数値、文字列、真偽値、そして {{jsxref("null")}} をシリアライズする構文です。これは JavaScript の構文に基づいていますが、区別されるものです。ある JavaScript が JSON であるわけでは<em>ありません</em>。</p>
<dl>
<dt><strong>Objects と Arrays</strong></dt>
<dd>プロパティ名は二重引用符で括った文字列にしなければなりません。また、<a href="/ja/docs/Web/JavaScript/Reference/Trailing_commas">末尾にカンマ</a>を置いてはいけません。</dd>
<dt><strong>Numbers</strong></dt>
<dd>先頭にゼロを置くことは禁止されています。また、小数点は1桁以上の数字の後ろに置かなければなりません。 <code>NaN</code> と <code>Infinity</code> には対応していません。</dd>
<dt><strong>あらゆる JSON のテキストは有効な JavaScript の式です...</strong></dt>
<dd>...ただし、 <a href="https://github.com/tc39/proposal-json-superset">proposal to make all JSON text valid ECMA-262</a> を実装した JavaScript エンジンのみでの話です。この提案を実装していないエンジンでは、 U+2028 LINE SEPARATOR と U+2029 PARAGRAPH SEPARATOR は JSON の文字列リテラルとプロパティのキーでは許されますが、これらの機能を JavaScript 文字列リテラルの中で使用すると {{jsxref("SyntaxError")}} になります。</dd>
</dl>
<p>{{jsxref("JSON.parse()")}} が文字列を JSON として解釈し、 {{jsxref("eval")}} が文字列を JavaScript として実行するこの例を考えてみてください。</p>
<pre class="brush: js notranslate">let code = '"\u2028\u2029"'
JSON.parse(code) // どのエンジンでも "\u2028\u2029" と評価される
eval(code) // 古いエンジンでは SyntaxError が発生する
</pre>
<p>他の違いとしては、二重引用符で囲まれた文字列のみを許可していることや、 {{jsxref("undefined")}} やコメントの規定がないことなどが挙げられます。 JSON に基づいたより人間に優しい設定フォーマットを使いたい場合、 Babel コンパイラーによって使われる <a href="https://json5.org/">JSON5</a> と、より一般的に使われる <a href="https://en.wikipedia.org/wiki/YAML">YAML</a> があります。</p>
<h3 id="Full_JSON_syntax" name="Full_JSON_syntax">JSON の完全な構文</h3>
<p>JSON の完全な構文は以下のとおりです。</p>
<pre class="syntaxbox notranslate"><var>JSON</var> = <strong>null</strong>
<em>or</em> <strong>true</strong> <em>or</em> <strong>false</strong>
<em>or</em> <var>JSONNumber</var>
<em>or</em> <var>JSONString</var>
<em>or</em> <var>JSONObject</var>
<em>or</em> <var>JSONArray</var>
<var>JSONNumber</var> = <strong>-</strong> <var>PositiveNumber</var>
<em>or</em> <var>PositiveNumber</var>
<var>PositiveNumber</var> = DecimalNumber
<em>or</em> <var>DecimalNumber</var> <strong>.</strong> <var>Digits</var>
<em>or</em> <var>DecimalNumber</var> <strong>.</strong> <var>Digits</var> <var>ExponentPart</var>
<em>or</em> <var>DecimalNumber</var> <var>ExponentPart</var>
<var>DecimalNumber</var> = <strong>0</strong>
<em>or</em> <var>OneToNine</var> <var>Digits</var>
<var>ExponentPart</var> = <strong>e</strong> <var>Exponent</var>
<em>or</em> <strong>E</strong> <var>Exponent</var>
<var>Exponent</var> = <var>Digits</var>
<em>or</em> <strong>+</strong> <var>Digits</var>
<em>or</em> <strong>-</strong> <var>Digits</var>
<var>Digits</var> = <var>Digit</var>
<em>or</em> <var>Digits</var> <var>Digit</var>
<var>Digit</var> = <strong>0</strong> through <strong>9</strong>
<var>OneToNine</var> = <strong>1</strong> through <strong>9</strong>
<var>JSONString</var> = <strong>""</strong>
<em>or</em> <strong>"</strong> <var>StringCharacters</var> <strong>"</strong>
<var>StringCharacters</var> = <var>StringCharacter</var>
<em>or</em> <var>StringCharacters</var> <var>StringCharacter</var>
<var>StringCharacter</var> = any character
<em>except</em> <strong>"</strong> <em>or</em> <strong>\</strong> <em>or</em> U+0000 through U+001F
<em>or</em> <var>EscapeSequence</var>
<var>EscapeSequence</var> = <strong>\"</strong> <em>or</em> <strong>\/</strong> <em>or</em> <strong>\\</strong> <em>or</em> <strong>\b</strong> <em>or</em> <strong>\f</strong> <em>or</em> <strong>\n</strong> <em>or</em> <strong>\r</strong> <em>or</em> <strong>\t</strong>
<em>or</em> <strong>\u</strong> <var>HexDigit</var> <var>HexDigit</var> <var>HexDigit</var> <var>HexDigit</var>
<var>HexDigit</var> = <strong>0</strong> through <strong>9</strong>
<em>or</em> <strong>A</strong> through <strong>F</strong>
<em>or</em> <strong>a</strong> through <strong>f</strong>
<var>JSONObject</var> = <strong>{</strong> <strong>}</strong>
<em>or</em> <strong>{</strong> <var>Members</var> <strong>}</strong>
<var>Members</var> = <var>JSONString</var> <strong>:</strong> <var>JSON</var>
<em>or</em> <var>Members</var> <strong>,</strong> <var>JSONString</var> <strong>:</strong> <var>JSON</var>
<var>JSONArray</var> = <strong>[</strong> <strong>]</strong>
<em>or</em> <strong>[</strong> <var>ArrayElements</var> <strong>]</strong>
<var>ArrayElements</var> = <var>JSON</var>
<em>or</em> <var>ArrayElements</var> <strong>,</strong> <var>JSON</var>
</pre>
<p>重要でない{{glossary("whitespace", "ホワイトスペース")}}は、基本的に任意の場所に置くことができますが、 <code><var>JSONNumber</var></code> (数値に空白を含んではいけません) や <code><var>JSONString</var></code> (一致する文字であると解釈されるか、エラーが発生します) の内部を除きます。ホワイトスペースとして有効な文字はタブ文字 (<a href="http://unicode-table.com/en/0009/">U+0009</a>)、キャリッジリターン (<a href="http://unicode-table.com/en/000D/">U+000D</a>)、ラインフィード (<a href="http://unicode-table.com/en/000A/">U+000A</a>)、空白 (<a href="http://unicode-table.com/en/0020/">U+0020</a>) のみです。</p>
<h2 id="Static_methods" name="Static_methods">静的メソッド</h2>
<dl>
<dt>{{jsxref("JSON.parse()", "JSON.parse(<var>text</var>[, <var>reviver</var>])")}}</dt>
<dd>文字列 <code><var>text</var></code> を JSON として解析し、オプションで生成された値とそのプロパティを変換し、値を返します。 JavaScript と JSON の違いに関連するものを含め、 JSON の構文に違反すると {{jsxref("SyntaxError")}} が発生します。 <code><var>reviver</var></code> オプションを使用すると、他のデータ型を表すために使われた <code><var>replacer</var></code> を解釈することができます。</dd>
<dt>{{jsxref("JSON.stringify()", "JSON.stringify(<var>value</var>[, <var>replacer</var>[, <var>space</var>]])")}}</dt>
<dd>指定した値に対応する JSON 文字列を返します。オプションで、特定のプロパティのみを含むか、ユーザー定義の方法でプロパティ値を置き換えることもできます。既定では、すべての {{jsxref("undefined")}} のインスタンスは {{jsxref("null")}} に置き換えられ、その他の対応していないネイティブデータ型は打ち切られます。 <code><var>replacer</var></code> オプションでは、他の動作を指定することができます。</dd>
</dl>
<h2 id="例">例</h2>
<h3 id="JSONの例">JSONの例</h3>
<pre class="brush: json notranslate">{
"browsers": {
"firefox": {
"name": "Firefox",
"pref_url": "about:config",
"releases": {
"1": {
"release_date": "2004-11-09",
"status": "retired",
"engine": "Gecko",
"engine_version": "1.7"
}
}
}
}
}
</pre>
<h2 id="Specifications" name="Specifications">仕様書</h2>
<table class="standard-table">
<thead>
<tr>
<th scope="col">仕様書</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{SpecName('ESDraft', '#sec-json-object', 'JSON')}}</td>
</tr>
</tbody>
</table>
<h2 id="Browser_compatibility" name="Browser_compatibility">ブラウザーの互換性</h2>
<div>
<p>{{Compat("javascript.builtins.JSON")}}</p>
</div>
<h2 id="See_also" name="See_also">関連情報</h2>
<ul>
<li>{{jsxref("Date.prototype.toJSON()")}}</li>
</ul>
<h2 id="Tools" name="Tools">ツール</h2>
<ul>
<li><a href="http://www.jsondiff.com/">JSON Diff</a> checker</li>
<li><a href="http://jsonbeautifier.org/">JSON Beautifier/editor</a></li>
<li><a href="http://jsonparser.org/">JSON Parser</a></li>
<li><a href="https://tools.learningcontainer.com/json-validator/">JSON Validator</a></li>
</ul>
|