PHP
JSON

PHPでJSONデータの取得の仕方

More than 1 year has passed since last update.

はじめに

この記事は私のサイト『FantmSite』のブログでこう書いていたのですが、心機一転としてブログを閉鎖し、今後サイトをリニューアルすべくその一つとしてQiitaに移転させています。

記事の内容

はじめに

最近開発をせずに勉強ばかりしているので書く内容がなかなかないのですが、「【PHP】MySQLに保存しているデータをJSONで吐き出す」という記事は書いたのに、JSONの読み取りについて書いていなかったので、記述しておきたいと思います。

JSONデータの例

説明を行うために、まず今回利用するJSONデータの例を示しておきます。

jsondata.json
{"res":
    {"blogData":[
        {
            "id":"0001",
            "title":"サンプル01",
            "day":[
                {
                    "year":"2015",
                    "month":"03",
                    "_day":"31"
                }
            ],
            "author":"fantmsite",
            "tag":[
                "ブログ"
            ],
            "report":"ブログ内容サンプル01"
        },
        {
            "id":"0002",
            "title":"サンプル02",
            "day":[
                {
                    "year":"2015",
                    "month":"04",
                    "_day":"01"
                }
            ],
            "author":"fantmsite",
            "tag":[
                "ブログ"
            ],
            "report":"ブログ内容サンプル02"
        }
    ]}
}

このデータはブログなどに活用出来るようにしてみました。
JSONデータの取得
では、PHP側に移ります。まずJSONデータを取得するために、JSONデータがおかれているところにアクセスしないといけないので、

$url = "http://sample.com/jsondata.json";

のように$urlという変数を準備してあげて、JSONデータの置かれているURL先を格納してあげます。( http://sample.com/ のところはご自身の環境に対応して変えてください。)
次に、JSONデータを全て文字列に読み込むために、$jsonという変数を作ってあげて以下のように記述します。

$json = file_get_contents($url);

このfile_get_contentsについての説明はPHPの公式ドキュメントを下記に引用しておきます。

この関数は file() と似ていますが、 offset で指定した場所から開始し maxlen バイト分だけ ファイルの内容を文字列に読み込むという点が異なります。 失敗した場合、file_get_contents() は FALSE を返します。
file_get_contents()はファイルの内容を文字列に読み込む 方法として好ましいものです。もしOSがサポートしていれば パフォーマンス向上のためにメモリマッピング技術が使用されます。
(『http://php.net/manual/ja/function.file-get-contents.php』より)


次に、読み取ったJSONデータを表示するときに文字化けしないように次のように記述します。

$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');

mb_convert_encoding()というのを使います。これは、ASCII,JIS,UTF-8,EUC-JP,SJIS-WINの順番で自動検出し、UTF8に変換するということです。
私の下手な説明よりも、詳しくはPHPのドキュメントで確認してください。(http://php.net/manual/ja/function.mb-convert-encoding.php)
ただし、autoを使ったやり方はしないほうが無難ぽいので、使わないでください。

参考


次に、JSONデータを連想配列にします。

$arr = json_decode($json,true);

上のコードを見てもらうとわかるように、trueというのが第二引数で書かれています。これはなくてもjson_decode()の役割は果たせるのですが、trueがないと連想配列にはなりません。

サンプル

// stdClassのメンバへアクセス方法
$arr = json_decode($json);
echo $arr->res->blogData->id;

// 連想配列へのアクセス方法
$arr = json_decode($json, true);
echo $arr['res']['blogData']['id'];

ちなみにstdClassとは、

オブジェクトへの型変換で作られる

ものです。(php公式ドキュメントより)

はい、これで連想配列に持ち込めたので、あとは存在するかどうかを確認(ファイルはあっても読み込めないデータとかなんかデータが入っていなかったりとかを確認)して、変数に入れるだけで終わりです。

確認方法

if ($arr === NULL) {
    return;//〜データがない時の処理〜
}else{
    //〜存在しているときの処理〜
}

$arrは上記で示しているjson_decode($json,true)が格納されている$arrです。
それで、あとは変数を準備して次にように記述。

$bc_id = $arr["res"]["blogData"][0]["id"];

[0]とは、blogDataには上記のJSONデータでは2つあるので、[0]と[1]でどっちを指しているのかを示してあげる必要があるからです。

全体

では、最後に全てのコードを。

<?php
$url = "http://sample.com/jsondata.json";
$json = file_get_contents($url);
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
$arr = json_decode($json,true);

if ($arr === NULL) {
        return;
}else{
        $json_count = count($arr["res"]["blogData"]);
        $bc_id = array();
        $bc_title = array();
        $bc_write_day_year = array();
        $bc_write_day_month = array();
        $bc_write_day_day = array();
        $bc_author = array();
        $bc_tag = array();
        $bc_report = array();
        for($i=$json_count-1;$i>=0;$i--){
            $bc_id[] = $arr["res"]["blogData"][$i]["id"];
            $bc_title[] = $arr["res"]["blogData"][$i]["title"];
            $bc_write_day_year[] = $arr["res"]["blogData"][$i]["day"][0]["year"];
            $bc_write_day_month[] = $arr["res"]["blogData"][$i]["day"][0]["month"];
            $bc_write_day_day[] = $arr["res"]["blogData"][$i]["day"][0]["_day"];
            $bc_author[] = $arr["res"]["blogData"][$i]["autor"];
            $bc_tag[] = $arr["res"]["blogData"][$i]["tag"][0];
            $bc_report[] = $arr["res"]["blogData"][$i]["report"];
        }

}

何か問題などありましたら気軽にコメントください。
また、間違った説明などございましたらご教授のほどお願いいたします。