JSONの基本とPHPでの初歩的な利用方法について

こんにちは、ゆんつです。

「JSON」というデータフォーマットをご存じでしょうか?

JSONはJavaScriptオブジェクトの構文に従ったテキストベースのフォーマットで、JSONを使うことで異なる言語でデータの受け渡しを簡単にすることができるようになります。

Web APIから必要な情報を取得した場合。

取得したデータの形式にはJSONが使われていることが多いです。

このJSONで取得したデータをPHPで利用できるようにするためには、まずPHPで扱えるように適切な形に直してから必要な情報にアクセスすることが必要となります。

そこで今日はJSONの基本的な書き方やデータへのアクセスの仕方、そして具体的にAPIからJSONのデータを取得して必要な情報にアクセスしてみたいと思います。

JSONの基本的な書き方

JSONは{}の中に

"キー": 値

という形式で記述していきます。

{
  "name": "ゆんつ"
}

キーはダブルクォーテーションでくくる必要があり、シングルクォーテーションは使えません。

値は文字列の場合ダブルクォーテーションでくくる必要がありますが、それ以外の場合はくくる必要がありません。

複数記述する場合はコンマで区切ります。

{
  "name": "ゆんつ",
  "status": {
    "height": 165,
    "weight": 65
  }
}

使用できるデータ型は

  • 文字列
  • 数値
  • null
  • bool
  • オブジェクト
  • 配列

です。

実際に簡単なJSONを書いてみましょう。

{
  "name": "ゆんつ",
  "status": {
    "height": 165,
    "weight": 65
  },
  "hobby": [
    "travel",
    "gardening",
    "game"
  ]
}

これを「json_test.json」というファイル名で保存しておきます。

きちんとJSONが書けたかを確認したい場合はhttps://jsonformatter.curiousconcept.com/でチェックすると良いと思います。

バリデーション

「Fix JSON」という個所にチェックが入っているとダブルクォーテーションがシングルクォーテーションになっている場合などの軽微なミスがある場合に自動的にコードを修正してくれますが、JSONの書き方に慣れないうちはどこを間違えたのかを把握するために外しておいた方がいいかもしれません。

例えば「Fix JSON」のチェックを外しjson_test.jsonの"ゆんつ"をシングルクォーテーションの'ゆんつ'にしてチェックしてみると

バリデーションエラー

String should be wrapped in double quotes(文字列は二重引用符で囲む必要があります)というようにエラー内容が表示され、エラーが起きている個所を指摘してくれます。

きちんとJSONが書けていると以下のような画面になります。

バリデーションエラーなし

JSONの各データにアクセスする

JSON形式のデータを取得した場合には、まず取得したデータをjson_decode関数でデコードしてから各データにアクセスします。

先ほど作成したjson_test.jsonを使って実際に各データにアクセスしてみます。

まずはJSONファイルをfile_get_content関数を使って読み込みます。

$json = file_get_contents('json_test.json');

そして読み込んだJSONファイルをデコード。

デコードする場合にjson_decode関数の第2引数に何も指定しなければオブジェクト型に変換され、trueを指定すると連想配列に変換されます。

第2引数に何も指定しない場合(オブジェクト型に変換された場合)のアクセス方法

オブジェクト型に変換する場合は第2引数には何も指定しません。

$json = json_decode($json)

デコードされた結果をvar_dumpで見てみると以下のような形になっています。

オブジェクト型

各データにアクセスする場合はアロー演算子を使ってアクセスします。

$jsonという変数にオブジェクトが格納されている場合にnameの値にアクセスするには

$json->name;

でアクセスできますし、statusのheightの値なら

$json->status->height;

でアクセスできます。

また、hobbyのgameにアクセスする場合は

$json->hobby[2];

でアクセスできます。

第2引数にtrueを指定した場合(連想配列に変換された場合)のアクセス方法

第2引数にtrueを設定すると連想配列に変換されるので、連想配列の値へのアクセス方法でアクセスできます。

連想配列

例えばnameの値なら

$json['name'];

statusのheightの値なら

$json['status']['height'];

hobbyのgameなら

$json['hobby'][2];

でアクセスできます。

実際にAPIで使ってみる

ここまでで、JSONの基本的な書き方やデータへのアクセス方法が分かりまた。

これから実際にAPIにアクセスしてJSONを取得して、各データにアクセスしてみましょう。

国土交通省では「都道府県内市区町村一覧取得API」というものが提供されています。

https://www.land.mlit.go.jp/webland/api.html

このAPIを利用してJSONデータを取得し、必要なデータにアクセスしてみます。

都道府県内市区町村一覧取得APIは以下のコードで市区町村の一覧のJSONを取得することができます。

https://www.land.mlit.go.jp/webland/api/CitySearch?area=[エリアコード]

今回は山口県の市区町村の一覧を取得したいのでエリアコードには山口県の35を指定します。

まずfile_get_contentsでAPIからjson文字列を取得します。

$json = file_get_contents('https://www.land.mlit.go.jp/webland/api/CitySearch?area=35');

そして取得したJSON文字列をオブジェクトに変換

$json = json_decode($json);

オブジェクトに変換したJSON文字列をvar_dumpで確認してみるとdataに各市区町村のデータが存在することが分かります。

デコード結果

あとは必要なデータにアクセスするだけです。

foreachを使って市区町村を一覧表示してみます。

//APIからJSON文字列を取得する
$json = file_get_contents('https://www.land.mlit.go.jp/webland/api/CitySearch?area=35');

//JSON文字列をオブジェクトに変換
$json = json_decode($json);

//市区町村のIDと名前を一覧表示
foreach ($json->data as $city) {
  echo $city->id . ':' . $city->name . PHP_EOL;
}

完成形は以上のようなコードになりました。

このコードを実行するとブラウザには以下のように山口県の各市区町村のIDと名前が一覧表示されます。

市町村一覧

このような感じでPHPを使ってAPIからJSONデータを取得し、適切な形に変換して利用することができます。

いろいろ試してみると楽しいですよ

今回は基本的なJSONの書き方やデータへのアクセス方法、実際にAPIを使ってJSONを取得してデータを表示したりしてみました。

実際に試してみると割と簡単にJSONが扱えることが分かります。

公的機関や企業などではAPIでいろんな情報を公開しています。

自分が興味があるAPIからJSONを取得して、取得したJSONをデコードして見やすい形に整形したりする作業を繰り返していけば、基本的なことはすぐに身につくと思います。

楽しみながらいろいろと試してみると良いかもしれません。

ゆんつ
それでは、またー