ユアスク by みんなシステムズ

MENU

【PHP】json_decodeでJSONを連想配列に変換する方法!連想配列にならない原因とエラー処理の方法は?

2023/03/25

PHPでプログラムを書いているとJSON形式の文字列を扱う機会がときどきあります。

しかし、JSONの状態だとただの文字列でありプログラム上では非常に取り扱いをしにくいです。そこで、当記事では以下の2つの内容をご紹介いたします。

・json_decode()を使用してJSON形式の文字列を連想配列に変換する方法

・json_decode()のエラーハンドリングの方法

json_decode()でJSONを連想配列に変換する方法

例えば、以下のようなJSON形式の文字列があるとします。

{
    "users": [
        {
            "name": "taruo",
            "age": 20
        },
        {
            "name": "hanako",
            "age": 21
        },
        {
            "name": "jirou",
            "age": 18
        }
    ]
}

そんなときは以下のように json_decode()を使うとJSON形式の文字列を連想配列に変換することができます。

<?php

// 上記のJSONと内容は同じです
$json = '{"users":[{"name":"taruo","age":20},{"name":"hanako","age":21},{"name":"jirou","age":18}]}';
// JSON形式の文字列を連想配列へ変換
$users = json_decode($json, true);

// 確認
var_dump($users);

var_dump()の出力内容は以下の通りですので、きちんと連想配列になっていることを確認できます。

array(1) {
  ["users"]=>
  array(3) {
    [0]=>
    array(2) {
      ["name"]=>
      string(5) "taruo"
      ["age"]=>
      int(20)
    }
    [1]=>
    array(2) {
      ["name"]=>
      string(6) "hanako"
      ["age"]=>
      int(21)
    }
    [2]=>
    array(2) {
      ["name"]=>
      string(5) "jirou"
      ["age"]=>
      int(18)
    }
  }
}

JSONが連想配列にならない原因は?

しかし、json_decode()を使用しているにも関わらず上手く連想配列にならないときがあります。その原因はjson_decode()の使い方にあります。

$json = '{"users":[{"name":"taruo","age":20},{"name":"hanako","age":21},{"name":"jirou","age":18}]}';

// 連想配列になる
$users1 = json_decode($json, true);
// オブジェクトになる
$users2 = json_decode($json);

// 後者を確認
var_dump($users2);

オブジェクトになるケースの出力を確認すると内容は以下の通りです。stdClassのオブジェクトになっていることが分かります。

object(stdClass)#4 (1) {
  ["users"]=>
  array(3) {
    [0]=>
    object(stdClass)#1 (2) {
      ["name"]=>
      string(5) "taruo"
      ["age"]=>
      int(20)
    }
    [1]=>
    object(stdClass)#2 (2) {
      ["name"]=>
      string(6) "hanako"
      ["age"]=>
      int(21)
    }
    [2]=>
    object(stdClass)#3 (2) {
      ["name"]=>
      string(5) "jirou"
      ["age"]=>
      int(18)
    }
  }
}

実はjson_decode()には引数が4つあり、2つ目の引数を true にすると連想配列に、指定しない場合はstdClassのオブジェクトになってしまいます。

json_decode(
    string $json,
    ?bool $associative = null,
    int $depth = 512,
    int $flags = 0
): mixed

associative

true の場合、返されるオブジェクトは連想配列形式になります。 false の場合、返されるオブジェクトは object になります。 null の場合、返されるオブジェクトは flags に JSON_OBJECT_AS_ARRAY が設定されているかどうかによって、 連想配列形式か object かが変化します。

https://www.php.net/manual/ja/function.json-decode.php#refsect1-function.json-decode-parameters

ですので、JSON形式の文字列を連想配列へ変換したいときは json_decode()の第2引数に true を設定するのを忘れないようにしましょう。

$json = '{"users":[{"name":"taruo","age":20},{"name":"hanako","age":21},{"name":"jirou","age":18}]}';

// 連想配列になる
$users1 = json_decode($json, true);
// オブジェクトになる
$users2 = json_decode($json);

json_decode()のエラーハンドリングの方法

json_decode()は戻り値がfalseやnullになる場合があります。

戻り値 ¶
json でエンコードされたデータを、適切な PHP の型として返します。 true、false および null はそれぞれ true、false そして null として返されます。 json のデコードに失敗したり エンコードされたデータがネストの最大値を超えているなどの場合、null を返します。
https://www.php.net/manual/ja/function.json-decode.php#refsect1-function.json-decode-returnvalues

JSONのフォーマットがおかしいときなどには正しくデコードできないということですので、エラーハンドリングの処理もきちんと入れておくと安心です。

// 不正なフォーマットのJSON
// tarou の "age" : 20 の後ろに不要なカンマ(,)を付けています
$json = '{"users":[{"name":"taruo","age":20,},{"name":"hanako","age":21},{"name":"jirou","age":18}]}';
$users = json_decode($json, true);

// エラーハンドリング
if(!is_array($users)){ // 連想配列に変換できているかどうかをチェック
    // エラー時の処理を記述
}

// 以降は正常にデコードできたときの処理を記述

まとめ

プログラムを書いているとJSONを扱う機会は多いです。

しかし、JSON形式の文字列のままだと非常に扱いにくいため、プログラム上で扱いやすい連想配列に変換するのが良いと思います。

是非、当記事で紹介したjson_decode()の使い方を試してみて下さい。