以前、PHPで応答をJSON形式で返す方法をご紹介しました。今回は、JSON(ジェイソン、JavaScript Object Notation)を受信した時にPHPでオブジェクト毎にパース(解析)して、連想配列に格納する方法をご紹介します。

次のようなJSON形式のデータを受信したとします。今回はこの内容をresponse.jsonというファイルを作って、ファイルの内容を以下のようにしておきます。

response.json

{
"name":"アイスケット",
"address":"神奈川県",
"work":{
"program":"PHP",
"design":"CSS",
"database":"MySQL"
}
}

次にPHPですが、先ほどのresponse.jsonと同じフォルダにPHPファイルを作ってください。

<?php
// ファイルからJSONを読み込み
$json = file_get_contents("response.json");

// 文字化けするかもしれないのでUTF-8に変換
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');

// オブジェクト毎にパース
// trueを付けると連想配列として分解して格納してくれます。
$obj = json_decode($json, true);

// パースに失敗した時は処理終了
if ($obj === NULL) {
return;
}

// 表示
// アイスケット
echo $obj['name'];

// 表示
// PHP
echo $obj['work']['program'];
?>

上記の例は連想配列でパースしたものですが、オブジェクト形式のまま返す方法もあります。先程と違うのはjson_decode関数にtrueを付けないところと、オブジェクトへのアクセスが波括弧となるところです。

<?php
// ファイルからJSONを読み込み
$json = file_get_contents("response.json");

// 文字化けするかもしれないのでUTF-8に変換
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');

// オブジェクト毎にパース
// trueを付けると連想配列として分解して格納してくれます。
$obj = json_decode($json);

// パースに失敗した時は処理終了
if ($obj === NULL) {
    return;
}

// 表示
// アイスケット
echo $obj->{'name'};

// 表示
// PHP
echo $obj->{'work'}->{'program'};
?>

Amazon SNSからの応答をHTTPで受け取る場合は指定したエンドポイントにPOSTで投げてくるので、この方法を用いてやれば通知内容を解析することができます。

本日は以上です。