SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【php】古い環境でも json_encode()、json_decode() 使いたい

問題

指定された環境にシステムを構築しないといけなくなったのですが、phpが古いです。json_encode()、json_decode()がない環境のようです。

PHP Fatal error:  Call to undefined function json_encode() in xxxxxx 

どうしましょう。

json

答え

関数がないなら、作ればよい。

if (!function_exists('json_encode')) {
	function json_encode(){
		//中身
	}
	function json_decode(){
		//中身
	}
}

ただ、中身を自力で全部書くのは、勉強にはなるが、品質と速度を考慮すると、PEARなどからいただいてくるのが正解なことが多い。

PEARにありますね → http://pear.php.net/package/Services_JSON/

もらいましょう → ダウンロードページバージョン 1.0.3

解凍すると、特に他には依存せず、単独で使用できそうな JSON.php が入っている。

そのまま使わせていただきましょう。

// json_encode()関数が存在しないなら
if (!function_exists('json_encode')) {
	// JSON.phpを読み込んで
	require_once 'JSON.php';
	// json_encode()関数を定義する
	function json_encode($value) {
		$s = new Services_JSON();
		return $s->encodeUnsafe($value);
	}
	// json_decode()関数を定義する
	function json_decode($json, $assoc = false) {
		$s = new Services_JSON($assoc ? SERVICES_JSON_LOOSE_TYPE : 0);
		return $s->decode($json);
	}
}
// 以降、json_encode(), json_decode() が使用可能

上のコードでは、json_decode()の第2引数にも対応してみた。php付属のjson_decode()と同じように、デコード結果をオブジェクトで返してもらったり、配列で返してもらったりできる。

Service_JSON::encode というメソッドがあるが、このメソッドは header('Content-type: application/json'); を出力してくれるので、Service_JSON::encodeUnsafe というもうひとつ中の方で使用されているメソッドを使った。

細かい動きは、new Services_JSON()をするときの引数で変更できるので、やりたいことに応じて変更するとよい。

それでも残る問題

phpに組み込みの処理にはさすがにかなわないようで、このphpで書かれたJSONの処理は、階層の深いJSON文字列のパースなどで時間がかかりすぎる、メモリを使いすぎるなどの問題が発生することがある。

関連するメモ

コメント(4)

隣のMさん 2013年2月19日 16:38

とても役に立ちました!ありがとうございます!

匿名 2013年8月21日 18:43

ありがたく使わせていただきます。
「ないなら、作ればよい。」…カッコ(・∀・)イイ!!

yoshimura 2013年8月21日 19:06

いえーい カッコ(・∀・)イイ!!
お役に立ててよかったです。

ぱたろう 2014年2月28日 18:19

プログラム完成後アップロードしたら、本番サーバーがまさかのjson_encode非対応だったので助かりました!