今回はPHPにアクセスしてきた時の応答をJSON形式で返す方法をご紹介します。

一般的にPHPにブラウザでアクセスした時に出力するのはHTMLです。HTMLを出力することによって、ブラウザ上に文字や表やボタンなどのデザインが表示されているのです。HTMLはブラウザが構文を解釈することができるので、デザインとして表示しているわけですが、単なる文字列を出力しているにすぎません。

ということは、どのような文字列でも出力することができるわけです。今回はJSON(ジェイソン、JavaScript Object Notation)形式を出力してみたいと思います。JSONは10年くらいまえにWeb2.0という言葉と共に良く言われていたAJAX(Asynchronous JavaScript + XML)で使われる技術の1つです。XMLと比較して、構文がシンプルでデータ量も少ないことから、XMLよりJSONのほうが最近ではよく使われています。

では、PHPでJSON形式を出力する方法です。まずは、連想配列に項目を追加しておき、表示します。

// 連想配列を生成
// 表示内容
// {
// "name":"アイスケット",
// "address":"神奈川県",
// "work":{
//    "program":"PHP",
//    "design":"CSS",
//    "database":"MySQL"
// }
// }
$jsonArray = array(
    'name'    => 'アイスケット',
    'address' => '神奈川県',
    'work'    => array(
        'program'  => 'PHP',
        'design'   => 'CSS',
        'database' => 'MySQL'
    )
);

// 生成した連想配列からJSON形式に変換して、表示
echo json_xencode($jsonArray);

json_xencodeという関数は別途定義した関数です。PHP5.3でも利用できるように記述したものです。

以下の関数は「オープンソースこねこね」様のサイトを参考にさせて頂きました。ありがとうございます。

/**
 * ----------------------------------------------------------
 * PHP5.4からでないと対応していないUnicodeアンエスケープをPHP5.3でもできるようにしたラッパー関数
 * @param mixed   $value
 * @param int     $options
 * @param boolean $unescapee_unicode
 * ----------------------------------------------------------
 */
function json_xencode($value, $options = 0, $unescapee_unicode = true)
{
	$v = json_encode($value);

	if ($unescapee_unicode) {
		$v = unicode_encode($v);
		// スラッシュのエスケープをアンエスケープする
		$v = preg_replace('/\\\\\//', '/', $v);
	}

	return $v;
}

/**
 * ----------------------------------------------------------
 * Unicodeエスケープされた文字列をUTF-8文字列に戻す。
 * 参考:http://d.hatena.ne.jp/iizukaw/20090422
 * @param unknown_type $str
 * ----------------------------------------------------------
 */
function unicode_encode($str)
{
	return preg_replace_callback("/\\\\u([0-9a-zA-Z]{4})/", "encode_callback", $str);
}

function encode_callback($matches) {
	return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "auto");

json_xencode関数を定義しておけば、連想配列がそのままJSON形式で出力できるので非常に便利です。JSONというと難しく感じてしまう方もいるかもしれませんが、この関数を利用すれば特に意識することなく利用できると思います。