JSON
JSON(ジェイソン、JavaScript Object Notation)とは、JavaScriptのオブジェクトの文法をもとにした軽量データ記述言語およびデータシリアライゼーションフォーマットです。
文法[編集]
JSONは、JavaScriptの false / null / true / Object / Array / Number / String の7種類のオブジェクトのリテラルの組み合わせをシリアライズされたデータ形式 です(RFC8259)。多くの場合トップレベルのオブジェクトは Object(より一般的に用語で言えば、連想配列)であるが、仕様上は他の6種類のオブジェクトであってもよい。false
, null
, true
のいずれでも良いし、0
1文字でも有効なJSONのデータ です。このように自由度が高い形式ではあるが、Object のキーは String に限られるという制限があり、これがJavaScriptの内部オブジェクトと異なります。
用語[編集]
- キー
- 連想配列の要素を特定する文字列
- 値
- 連想配列の要素の値、false null true Object Array Number または String
例:
{"これがキー": "これが値"}
- 文字列
- 二重引用符で囲まれた0文字以上の文字の並びを表すトークン(UTF-8エンコードが必須)
例:
"これは文字列"
""
"このように二重引用符「\"」を文字列の中に含めることができる"
"全角空白=「\u3000」のようにエスケープシーケンスを使用してもよい"
キーの重複[編集]
キーが同じ連想配列内で複数回現れても文法上は不正とならない[1]が、そのオブジェクトを受け取ったソフトウェアの動作は予測できません。
JavaScriptでの活用例[編集]
たとえば、下記のような、htmlファイルに、JavaScript を組み込んだコードで、
<html>
<head>
<script>
// 成績表
const results = [
{"name": "ヤマダ" , "japanese": 80 , "mathematics": 70 },
{"name": "サトウ" , "japanese": 60 , "mathematics": 90 }
]
// デバッグ確認用
document.write (results[1].name)
</script>
</head>
<body>
</body>
</html>
このうち、
[
{"name": "ヤマダ" , "japanese": 80 , "mathematics": 70 },
{"name": "サトウ" , "japanese": 60 , "mathematics": 90 }
]
の部分が、JSONを採用したコードの例 です。
このhtmlファイルをwebブラウザで読む込むと、
サトウ
と表示します。
静的メソッド[編集]
JSON.parse()[編集]
JSON文字列をオブジェクトに変換して返します。
JSON.stringify()[編集]
オブジェクトをJSON文字列に変換して返します。
使用例[編集]
// json = '{"key": "value"}'; と同じ
var json = JSON.stringify( { 'key': 'value' } );
alert(json); // {"key": "value"}
// object = { 'key': 'value' }; と同じ
var object = JSON.parse(json);
JSONP[編集]
JSONP(ジェイソンピー、JSON with Padding)とは、動的にscript
要素を生成してJSONが埋め込まれた外部スクリプトを読み込むテクニックを指します。
function jsonp(json) {
alert( json.key );
}
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'http://www.example.com/api?callback=jsonp';
document.body.appendChild(script);
ここでhttp://www.example.com/apiが次のような返答を返すことを想定します。
jsonp({"key":"value"});
するとあらかじめ定義しておいたjsonp
関数が呼び出されるので、"value"
と表示されます。このようなテクニックを用いて外部のウェブサーバとJSON形式のデータをやり取りすることができます。
脚注[編集]
- ^ RFCにおいてはSHOULD NOTレベルでの要請