2017年9月26日星期二

PHPでJSONを出力して、JavaScriptで取得する方法

http://dot-town-lab.com/laboratory/item/24


JSON(JavaScript Object Notation)というデータフォーマットを扱ってみたのでメモしておきます。
JSONは、XMLなどと同じようなテキストベースのファイル形式らしい。名前に「JavaScript」が入っているように、JavaScriptとの相性がとても良いらしいので、試しに扱ってみる事に。

PHPでJSONを出力する

JavaScriptでJSONを扱う前に、PHPで扱うJSONデータを出力しようと思います。
  1. <?php
  2. // JSON形式のテキストを生成する
  3. $json = <<< JSON_DOC
  4. [
  5. {"name":"Google", "url":"https://www.google.co.jp/"},
  6. {"name":"Yahoo!", "url":"http://www.yahoo.co.jp/"}
  7. ]
  8. JSON_DOC;
  9.  
  10. // JSON用のヘッダを定義して出力
  11. header("Content-Type: text/javascript; charset=utf-8");
  12. echo $json;
  13. exit();
  14. ?>

上の方法は、JSON形式のテキストを自分で生成してますが、PHP5.2以上からはJSONに関しての関数が用意されているので、そちらを使った方が確実です。
PHP5.1以下の場合は、PEARの「Services_JSON」を利用してください。
  1. <?php
  2. $json = array(
  3. array('name'=>'Google', 'url'=>'https://www.google.co.jp/'),
  4. array('name'=>'Yahoo!', 'url'=>'http://www.yahoo.co.jp/'),
  5. );
  6.  
  7. header("Content-Type: text/javascript; charset=utf-8");
  8. echo json_encode($json); // 配列をJSON形式に変換してくれる
  9. exit();
  10. ?>

JavaScriptでJSONデータを取得するオブジェクト

非同期通信を行う場合は、jQueryの$.ajax()を利用した方が簡単ですけど、XMLHttpRequest()を使ったコードをメモしておきます。
  1. var myajax = function (options) {
  2. options = options ? options : {};
  3.  
  4. this.isloader = false;
  5. this.request = false;
  6. this.url = options.url;
  7. this.params = options.params ? options.params : null;
  8. this.error = typeof options.error == 'function' ? options.error : function (data) { return false; };
  9. this.loaded = typeof options.loaded == 'function' ? options.loaded : function (data) { return false; };
  10. };
  11. myajax.prototype = {
  12. load : function () {
  13. if (this.getRequest()) {
  14. this.sendRequest();
  15. }
  16. },
  17. getRequest : function () { // 通信のリクエスト
  18. if (!this.url || this.isloader) return false;
  19. if (window.ActiveXObject) { // XMLHttpRequest未実装ブラウザ
  20. try { // MSXML2以降用
  21. this.request = new ActiveXObject('Msxml2.XMLHTTP');
  22. } catch (e) { // 旧MSXML用
  23. try {
  24. this.request = new ActiveXObject('Microsoft.XMLHTTP');
  25. } catch (e2) {
  26. this.request = false;
  27. }
  28. }
  29. } else if (window.XMLHttpRequest) { // XMLHttpRequest実装ブラウザ
  30. this.request = new XMLHttpRequest();
  31. } else {
  32. this.request = false;
  33. }
  34. return this.request ? true : false;
  35. },
  36. sendRequest : function () { // リクエストの送信
  37. var t = this;
  38. if (!t.request) return false;
  39. t.isloader = true; // 通信判定(重複通信を防ぐ)
  40. t.request.open('POST', t.url, true); // 初期化
  41. t.request.onreadystatechange = function () { // 進行状況の確認
  42. if (this.readyState == 4) { // 通信完了
  43. switch (this.status) {
  44. case 200 : // 成功
  45. var obj = eval(this.responseText); // オブジェクトに変換
  46. t.loaded(obj);
  47. break;
  48. default : // 失敗
  49. t.error(this.statusText);
  50. break;
  51. }
  52. t.isloader = false;
  53. t.request = false;
  54. }
  55. };
  56. t.request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // ヘッダ設定
  57. t.request.send(t.setParameter()); // 送信
  58. },
  59. setParameter : function () { // 送信パラメータの設定
  60. if (!this.params) return null;
  61. var result = '';
  62. for (var key in this.params) {
  63. var value = this.params[key];
  64. result += (result ? '&' : '') + key + '=' + encodeURIComponent(value);
  65. }
  66. return result ? result : null;
  67. }
  68. };

非同期通信を実行する

document.body.onloadを使用した場合は、bodyタグより下に記述しないと、bodyタグが存在しません的なエラーが返されるので注意。
  1. <body>
  2. <!-- bodyタグより下に記述 -->
  3. </body>
  4.  
  5. <script type="text/javascript">
  6. //<![CDATA[
  7. var ma = new myajax({ // myajaxオブジェクトを生成
  8. url : '/ajax/json.php',
  9. params : {},
  10. error : function (data) {
  11. console.log(data);
  12. },
  13. loaded : function (data) {
  14. console.log(data[0].name); // 出力結果:Google
  15. }
  16. });
  17.  
  18. document.body.onload = ma.load(); // 通信実行
  19. //]]>
  20. </script>



没有评论:

发表评论