私が使用したいアプローチは、jsonをオブジェクトリテラルでパディング/ラップし、ファイルを.jsonpファイル拡張子で保存することです。この方法では、代わりに新しいjsonpファイル(test.jsonp)を使用するため、元のjsonファイル(test.json)は変更されません。ラッパーの名前は任意ですが、jsonpの処理に使用するコールバック関数と同じ名前である必要があります。例として投稿されたtest.jsonを使用して、「test.jsonp」ファイルのjsonpラッパーの追加を示します。
json_callback({"a" : "b", "c" : "d"});
次に、スクリプト内にグローバルスコープを持つ再利用可能な変数を作成して、返されたJSONを保持します。これにより、コールバック関数だけでなく、スクリプト内の他のすべての関数で返されたJSONデータを利用できるようになります。
var myJSON;
次は、スクリプトインジェクションによってjsonを取得する簡単な関数です。IEはjQuery .appendメソッドをサポートしていないため、ここではjQueryを使用してスクリプトをドキュメントヘッドに追加できないことに注意してください。以下のコードでコメントアウトされているjQueryメソッドは、.appendメソッドをサポートする他のブラウザーで動作します。これは、違いを示すための参照として含まれています。
function getLocalJSON(json_url){
var json_script = document.createElement('script');
json_script.type = 'text/javascript';
json_script.src = json_url;
json_script.id = 'json_script';
document.getElementsByTagName('head')[0].appendChild(json_script);
// $('head')[0].append(json_script); DOES NOT WORK in IE (.append method not supported)
}
次は、json結果データをグローバル変数に取得するための、短くて単純なコールバック関数(jsonpラッパーと同じ名前)です。
function json_callback(response){
myJSON = response; // Clone response JSON to myJSON object
$('#json_script').remove(); // Remove json_script from the document
}
jsonデータは、ドット表記を使用してスクリプトの任意の関数からアクセスできるようになりました。例として:
console.log(myJSON.a); // Outputs 'b' to console
console.log(myJSON.c); // Outputs 'd' to console
この方法は、見慣れた方法とは少し異なる場合がありますが、多くの利点があります。まず、同じjsonpファイルをローカルに、または同じ関数を使用してサーバーからロードできます。おまけとして、jsonpはすでにクロスドメインフレンドリーな形式になっており、RESTタイプのAPIでも簡単に使用できます。
確かに、エラー処理関数はありませんが、なぜ必要なのでしょうか?このメソッドを使用してjsonデータを取得できない場合は、json自体にいくつかの問題があることを確信できます。私はそれを適切なJSONバリデーターで確認します。
JSON
すでにJavaScriptオブジェクトを取得している文字列を返す場合、を使用する必要はありませんeval()
。