JSON を HTML に埋め込んで jQuery でごにょごにょするメモ

March 3, 2015

そうだ。Ajax じゃなくて HTML に json を埋め込んでページと一緒に送信しちゃえばいい。HTML に埋め込んだ方が gzip が効いて通信量は減るし、Ajax によるサーバーの負荷も減る。なんて優しい設計なんだ。

Note for JSON and JavaScript(jQuery) with PHP

唐突でしたが、本稿は、PHP で json データをファイルに書き出し、その json データを HTML に埋め込んで jQuery で処理するサンプル プログラムとメモです。

PHP で json データをファイルに書き出す

json にしたいデータを配列に格納し、json_encode() 関数で json に変換して file_put_contents() 関数でファイルに書き出します。

PHP

$json_array = array();
foreach( $rows as $data ){
	$json_array[] = array(
		'data1' => $data->data1,
		'data2' => $data->data2,
		'data3' => $data->data3,
	);
}

$json = json_encode( $json_array, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP );

$file = 'json/data.json';

file_put_contents( $file, $json );

PHP と json については以下のページが詳しく解説されています。

json データを HTML に埋め込む

json データを HTML に埋め込むには、script タグで type 属性に application/json を指定します。jQuery で参照しやすいように ID 属性もお忘れなく。

HTML(PHP)

...
<script id="dataJSON" type="application/json"><?php readfile( 'json/data.json' ); ?></script>
...

json の MIME タイプ

本当に「application/json」かな? ソースが明示されていないときに疑うのは大事。Wikipedia のリンクを掲載します。日本語版て ちょっと不安だよね。というわけで英語版も。

HTML に埋め込まれた json を jQuery で処理する

script 要素の中身(json データ)を .html() 関数で取得し、$.parseJSON() 関数でオブジェクトに展開して $.each() 関数で処理します。

JavaScript(jQuery)

$('#dataJSON').replaceWith(
	$('<div id="dataPool" />').css('display', 'none').append(function(){
		var json = $('#dataJSON').html();

		var items = $.parseJSON( json );

		var $container = $('<div class="dataContainer" />');

		$.each( items, function(){
			var $item = $('<div />').addClass(this.data1).data({
				data2: this.data2,
				data3: this.data3
			});

			$container.append($item);
		});

		return $container;
	})
);

このサンプル プログラムでは、json データを要素の data オブジェクトに格納したテンポラリ要素を生成しています。

階層構造の json を処理する場合の jQuery サンプル コード

以下の Stack Overflow エントリをご参考ください。日本語でok。

注意点

最近のグーグル先生は、JavaScript(jQuery)なんか余裕で解釈(実行)してページを解析しています。つまり、json から jQuery で生成した要素もページの評価に直接影響します。SEO を意識しなければなりません。これについて筆者の身に起きた悲劇を別記事にしていますので、よろしければご一読ください。

背景

データベースの情報を json で返す API をつくりました。その json データは、サイトのすべてのページで使うため、API へのアクセスはページビューに応じて多くなります。でも、データベースの更新頻度は低く、ほとんど毎回 同じ json データを返します。これは もったいない。何がって データベースのリソースが。筆者だってデータベースの負荷は低い方が良いことくらい心得ている。

改善策として、json をファイルに書き出します。ファイルにキャッシュするともいう。そしてクライアント側の JavaScript は、そのファイルを非同期通信で GET します。Ajax というヤツですね。

いや、ちょっと待って。それなら Ajax じゃなくて HTML に json を埋め込んでページと一緒に送信しちゃえば良いのでは。PHP で json データをファイルに書き出し、その json データを HTML に埋め込んで jQuery で処理する、この一連の流れがまとまったページが無かったので書きました。きっと誰かのお役に立つことでしょう!

コメントを残す

メールアドレスが公開されることはありません。