JSONとは、オブジェクトや配列を組み合わせて構造化されたデータを表現する、データ記述言語です。
オブジェクトと配列は制限なくネストできるため、それにより複数のデータを記述できます。
数値は10進数で記述します。8進数や16進数は使用できません。
負数を表すにはマイナス記号 ( - ) を付けますが、正数を表すのにプラス記号 ( + ) は使用できません。
JavaScriptでは文字列を記述するのに、ダブルクォート ( " ) かシングルクォート ( ' ) のいずれかを使用できます。しかしJSONでは、ダブルクォートしか認められないことに注意が必要です。
使用可能な文字は、ダブルクォート ( " ) とバックスラッシュ ( \ ) 以外です。また以下のエスケープシーケンスをサポートします。
表記 | 意味 |
---|---|
\" | 二重引用符 (quotation mark) |
\\ | バックスラッシュ (reverse solidus) |
\/ | スラッシュ (solidus) |
\b | 後退 (バックスペース) (backspace) |
\f | 改ページ (formfeed) |
\n | 改行 (newline) |
\r | 復帰 (carriage return) |
\t | タブ (horizontal tab) |
\uXXXX | 4桁の16進数で表記されたUnicode文字 (4 hexadecimal digits) |
なおサーバからJSONで出力する場合には、バックスラッシュ自体がエスケープ文字とみなされてしまうため、「\\n」のようにバックスラッシュをエスケープする必要があります。
オブジェクトは基本的にオブジェクトリテラルの形式で記述しますが、プロパティ名は文字列としてダブルクォート ( " ) で囲む点が異なります。
{ "property1":"text", "property2":10 }
最後の要素の後にカンマ (,) を付けてはなりません。シングルクォートは許されないため、必ずダブルクォートとします。
配列は配列リテラルの形式で記述します。
[ 1, 2, "text" ]
最後の要素の後にカンマ (,) を付けてはなりません。
「true」「false」と記述します。
true
「null」と記述します。
null
エンコーディング | UTF-8 |
---|---|
拡張子 | .json |
MIMEタイプ | application/json |
次のサンプルで、MIMEの違いによりブラウザでどのように認識されるか確認できます。
JSONオブジェクトがサポートされるならば、そのメソッドによりJSON文字列とJavaScriptオブジェクトを簡単に変換できます。それがサポートされるかどうかは、簡単にはWindowオブジェクトにJSONプロパティが存在するかどうかで判別できます。
if( window.JSON )
{
// JSONがサポートされる
}
ちなみにPrototype.jsでは、
var NATIVE_JSON_PARSE_SUPPORT = window.JSON && typeof JSON.parse === 'function' && JSON.parse('{"test": true}').test;
のように判別しています。
JSON.parseがサポートされるならば、それでJSON形式の文字列をオブジェクトに変換できます。
JSON.parse( text [, reviver ] )JSON.parse - JavaScript | MDN
JSON.parse( '{ "a":1, "b":"foo", "c":null }' ); // Object { a=1, b="foo", c=null} JSON.parse( '{ "a":true, "b":"true", "c":false, "d":"false" }' ); // Object { a: true, b: "true", c: false, d: "false" }
解析対象のtextが有効なJSON文字列ではない場合には、SyntaxError例外が発生します。
JSON.parse( '' ); // unexpected end of data JSON.parse( 'a' ); // unexpected character JSON.parse( '"\\a"' ); // bad escaped character JSON.parse( '{"a"}' ); // expected ':' after property name in object JSON.parse( '"{"a":""}"' ); // unexpected non-whitespace character after JSON data
特に空白文字には注意が必要で、それがWhite spaceと見なされないとパースに失敗します。
JSON.parse( '{"a" : 1}' ); // OK JSON.parse( '{"a"\x09: 1}' ); // OK JSON.parse( '{"a"\x20: 1}' ); // OK JSON.parse( '{"a"\xa0: 1}' ); // SyntaxError: JSON.parse: expected ':' after property name in object
オブジェクトへの変換に特別な処理が必要ならば、関数をreviverに渡して処理します。
JSON形式の文字列データは、eval()関数で評価することでもJavaScriptのオブジェクトに変換できます。このときeval()に渡す文字列はかっこで囲む必要があります。さもなくば「SyntaxError: invalid label」として例外が発生します。
var data = '{ "property1":"text", "property2":10 }'; var obj = eval( '(' + data + ')' );
このコードを実行するとobjは、
のようになります。
eval()の使用には危険が伴うため、信頼できるデータ以外には使用してはなりません。eval を使わないでください! - eval - JavaScript | MDN
JSON.stringify()がサポートされるならば、それでオブジェクトをJSON形式の文字列に変換できます。
JSON.stringify( value[, replacer [, space]] )JSON.stringify(value[, replacer [, space]])
var obj = { a: 1, b: 'foo', c: null, d: function(){} };
var str = JSON.stringify( obj );
// '{"a":1,"b":"foo","c":null}'
オブジェクトのプロパティを一覧表示する方法を利用して、プロパティを文字列として連結することでもJSON文字列に変換できます。
XMLHttpRequestと組み合わせることで、サーバからJSON形式のデータを取得して処理できます。
var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.onreadystatechange = function()
{
var READYSTATE_COMPLETED = 4;
var HTTP_STATUS_OK = 200;
if( this.readyState == READYSTATE_COMPLETED
&& this.status == HTTP_STATUS_OK )
{
// レスポンス ヘッダでJSONのデータであることを確認する※1
if( this.getResponseHeader( 'Content-Type' ).indexOf( 'application/json' ) != -1 )
{
var obj;
if( window.JSON )
{
obj= JSON.parse( this.responseText );
}
else
{
obj= eval( '(' + this.responseText + ')' );
}
}
}
}
var requestUrl = 'sample.json';
xmlHttpRequest.open( 'GET', requestUrl );
xmlHttpRequest.send( null );
※1 サーバの設定によっては「application/json; charset=utf-8」のように返されることがあるため、'application/json'
との等値では判断を誤ることがあります。
Prototype.jsを使用するならば、同様の処理は次のようになります。
new Ajax.Request( 'sample.json', { method: 'get', onSuccess: function( response ) { var data = response.responseJSON; } } );
なおPrototype.jsでは、window.JSONがサポートされるならばそれで、さもなくばeval()でJavaScriptオブジェクトへの変換を行っています。
人間が読みやすいように、JSON形式のデータを書式化するツールがあります。
Firefox 44以降から開発ツールに組み込まれており、コンテンツタイプが'application/json'のデータをブラウザ内で確認できます。ただし既定では無効化されているため、利用するにはabout:configの[devtools.jsonview.enabled]をtrueとします。JSON viewer - Firefox Developer Tools | MDN
読み込んだデータに問題があるときには、SyntaxErrorとしてそれが通知されます。
JSONViewはFirefoxのアドオンであり、'application/json'または任意のコンテンツタイプのデータをブラウザ内で確認できます。
このアドオンは正確なJSONデータしか受け入れず、書式に誤りがあるときには読み込み中のまま処理が終了しません。
前述のJSON viewerが有効になっていると、JSONViewは機能しません。
Notepad++のプラグインであるJSToolNppでは、テキストのJSONデータを書式化できます。
このツールでは書式に誤りがある場合でも、それなりに表示してくれます。ただしエスケープされた文字列もそのまま表示されるため、別途アンエスケープが必要です。