Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】json_decode()関数の使い方

json_decode関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

json_decode関数は、JSON形式の文字列をPHPの変数に変換する関数です。具体的には、JSON文字列を解析し、対応するPHPの型(配列、オブジェクト、文字列、数値、真偽値、null)に変換します。この関数は、Web APIからのデータ受信や、設定ファイルの読み込みなど、JSON形式で記述されたデータをPHPで扱う場合に非常に役立ちます。

関数の基本的な使い方は、JSON文字列を引数として与えるだけです。例えば、json_decode('{"key": "value"}')のように使用します。デフォルトでは、JSONオブジェクトはPHPのstdClassオブジェクトとしてデコードされますが、第二引数にtrueを指定することで、連想配列としてデコードすることも可能です。

また、第三引数で再帰の深さの上限を設定できます。これは、JSONデータが深くネストされている場合に、無限ループを防ぐためのものです。第四引数では、JSON_THROW_ON_ERRORフラグを指定することで、エラー発生時にJsonExceptionをスローさせることができます。

この関数を使用する際には、JSON文字列が正しい形式である必要があります。JSONの構文エラーがあると、関数はnullを返し、json_last_error関数でエラーの種類を確認できます。PHP 7.3以降では、JSON_THROW_ON_ERRORフラグを使用することで、より詳細なエラー情報を例外として取得できます。

構文(syntax)

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

引数(parameters)

string $json, ?bool $associative = null, int $depth = 512, int $flags = 0

  • string $json: デコードしたいJSON形式の文字列
  • ?bool $associative = null: trueを指定すると、JSONオブジェクトを連想配列として返します。falseまたはnullを指定すると、JSONオブジェクトをPHPのオブジェクトとして返します。
  • int $depth = 512: 再帰の深さの上限を指定します。
  • int $flags = 0: JSONデコードの挙動を制御するビットマスクフラグ。

戻り値(return)

mixed

JSON形式の文字列をデコードした結果を返します。オブジェクトは連想配列、配列は添字配列として取得されます。デコードに失敗した場合は null が返されます。

サンプルコード

JSONをPHP配列・オブジェクトへ変換する

1<?php
2
3/**
4 * json_decode のサンプルコード
5 */
6
7// JSON 文字列
8$json_string = '{"name": "太郎", "age": 30, "city": null}';
9
10// json_decode を使用して PHP の連想配列に変換
11$associative_array = json_decode($json_string, true);
12
13// 結果の確認
14if ($associative_array === null && json_last_error() !== JSON_ERROR_NONE) {
15    // JSON デコードエラーが発生した場合
16    echo 'JSON デコードエラー: ' . json_last_error_msg() . PHP_EOL;
17} else {
18    // デコード成功
19    echo "名前: " . $associative_array['name'] . PHP_EOL;
20    echo "年齢: " . $associative_array['age'] . PHP_EOL;
21    echo "都市: " . ($associative_array['city'] ?? 'N/A') . PHP_EOL; // null 合体演算子を使用
22}
23
24// オブジェクトとしてデコードする場合 (第2引数を省略または false にする)
25$object = json_decode($json_string);
26
27// オブジェクトの場合のプロパティへのアクセス
28if ($object !== null && json_last_error() === JSON_ERROR_NONE) {
29    echo "名前 (オブジェクト): " . $object->name . PHP_EOL;
30    echo "年齢 (オブジェクト): " . $object->age . PHP_EOL;
31    echo "都市 (オブジェクト): " . ($object->city ?? 'N/A') . PHP_EOL;
32}

PHPのjson_decode関数は、JSON形式の文字列をPHPの変数(連想配列またはオブジェクト)に変換するために使用します。

サンプルコードでは、まずJSON形式の文字列 $json_string を定義しています。json_decode($json_string, true) は、この文字列を連想配列に変換します。第2引数に true を指定することで、連想配列として結果を取得できます。省略した場合や false を指定した場合は、オブジェクトとしてデコードされます。

デコード後の $associative_array の要素には、キーを指定してアクセスできます。存在しないキーにアクセスした場合にエラーとならないよう、null合体演算子 ?? を使用して、null の場合に 'N/A' を表示するようにしています。

また、JSONデコードが失敗した場合(例えば、JSON文字列の形式が正しくない場合)は、json_decodenull を返します。json_last_error() 関数で最後に発生したJSONエラーの種類を確認し、エラーメッセージを表示することで、問題の原因を特定できます。

オブジェクトとしてデコードする場合は、プロパティに -> 演算子を使ってアクセスします。

json_decode関数は、JSON形式の文字列をPHPのデータ型(連想配列またはオブジェクト)に変換します。第2引数$associativetrueを指定すると連想配列、省略またはfalseを指定するとオブジェクトとしてデコードされます。JSON文字列にエラーがある場合や、デコードに失敗した場合はnullを返します。json_last_error()関数でエラーの種類を確認し、json_last_error_msg()関数で詳細なエラーメッセージを取得できます。JSONにnullが含まれる場合、連想配列ではnull値、オブジェクトではプロパティとしてnullが設定されます。PHP 7.0以降では、null合体演算子(??)を使うことで、nullの場合の代替値を簡単に指定できます。

PHPでjson_decodeしstdClassオブジェクトを生成する

1<?php
2
3/**
4 * json_decode関数の使用例。
5 * JSON文字列をPHPのオブジェクト(stdClass)に変換する方法を示します。
6 */
7function decodeJsonToStdClassExample(): void
8{
9    // サンプルとなるJSON文字列を定義します。
10    // キーと値のペアで構成され、オブジェクトや配列もネストできます。
11    $jsonString = '{
12        "productName": "スマートウォッチ",
13        "price": 15000,
14        "isAvailable": true,
15        "features": ["防水", "心拍計", "GPS"],
16        "details": {
17            "color": "ブラック",
18            "weightGrams": 50
19        }
20    }';
21
22    echo "--- 元のJSON文字列 ---\n";
23    echo $jsonString . "\n\n";
24
25    // json_decode関数を使ってJSON文字列をデコードします。
26    // 第二引数 `$associative` を省略するか `false` にすると、
27    // JSONオブジェクトはPHPの標準クラス `stdClass` のオブジェクトに変換されます。
28    $decodedObject = json_decode($jsonString);
29
30    echo "--- オブジェクト(stdClass)としてデコードされた結果 ---\n";
31
32    // デコードが成功したかを確認します。
33    // json_last_error() は最後に発生したJSONエラーコードを返します。
34    if (json_last_error() === JSON_ERROR_NONE) {
35        // var_dumpは変数の型と値を詳細に表示します。
36        // これにより、デコード結果がstdClassのオブジェクトであることがわかります。
37        var_dump($decodedObject);
38
39        echo "\n--- オブジェクトのプロパティへのアクセス ---\n";
40        // オブジェクトのプロパティには `->` 演算子を使ってアクセスします。
41        echo "商品名: " . $decodedObject->productName . "\n";
42        echo "価格: " . $decodedObject->price . "円\n";
43        echo "利用可能か: " . ($decodedObject->isAvailable ? 'はい' : 'いいえ') . "\n";
44        // 配列の要素には通常の配列アクセスと同じように `[]` を使います。
45        echo "主要機能: " . $decodedObject->features[0] . ", " . $decodedObject->features[1] . "\n";
46        // ネストされたオブジェクトのプロパティにも続けて `->` を使ってアクセスします。
47        echo "詳細(色): " . $decodedObject->details->color . "\n";
48
49        // デコード結果が `stdClass` のインスタンスであるかを確認します。
50        echo "\nデコード結果はstdClassのインスタンスですか? "
51            . ($decodedObject instanceof stdClass ? 'はい' : 'いいえ') . "\n";
52
53    } else {
54        // デコードに失敗した場合、エラーメッセージを表示します。
55        echo "JSONデコードエラーが発生しました: " . json_last_error_msg() . "\n";
56    }
57
58    echo "\n--- 無効なJSON文字列のデコード例 ---\n";
59    $invalidJsonString = '{"name": "テスト", "age": 25,'; // 不完全なJSON
60
61    $decodedInvalid = json_decode($invalidJsonString);
62
63    if (json_last_error() !== JSON_ERROR_NONE) {
64        echo "無効なJSONをデコードしようとしました。\n";
65        echo "エラーメッセージ: " . json_last_error_msg() . "\n";
66    }
67}
68
69// 定義した関数を実行します。
70decodeJsonToStdClassExample();
71
72?>

PHP 8のjson_decode関数は、JSON形式の文字列をPHPで扱えるデータ型に変換するための拡張機能です。Web APIなど外部システムとのデータ連携において、JSONデータをPHPプログラムで利用する際に頻繁に用いられます。

この関数は第一引数に変換したいJSON文字列を受け取ります。第二引数$associativeを省略するかfalseに設定した場合、JSONオブジェクトはPHPの標準的なクラスであるstdClassのインスタンスとしてデコードされます。これにより、JSONのキーがstdClassオブジェクトのプロパティとなり、$オブジェクト->プロパティ名のように直感的にデータにアクセスできます。JSON内の配列はPHPの配列に、ネストされたオブジェクトもstdClassオブジェクトとして再帰的に変換されます。

デコードが成功した場合、変換されたPHPのデータ(stdClassオブジェクト、配列、文字列、数値など)が戻り値として返されます。しかし、JSON文字列が不正であるなどデコードに失敗した場合はnullが返されます。デコードの成否はjson_last_error()関数で確認でき、JSON_ERROR_NONEであれば成功です。エラー時にはjson_last_error_msg()で具体的なエラーメッセージを取得できます。サンプルコードでは、JSON文字列がstdClassオブジェクトに変換され、そのプロパティにアクセスする方法や、エラー処理の例を示しています。

PHPのjson_decode関数は、JSON文字列をPHPのデータ型に変換します。第二引数を省略するかfalseにすると、JSONオブジェクトはstdClassという汎用オブジェクトになります。このオブジェクトのプロパティには->演算子でアクセスします。JSON内の配列はPHPの配列として、ネストされたオブジェクトも同様にstdClassオブジェクトとして扱えます。

最も重要な注意点は、無効なJSONをデコードするとnullが返ることです。必ずjson_decodeの戻り値とjson_last_error()関数でデコードエラーを確認し、適切にエラー処理を行ってください。これにより、プログラムの安定性が向上します。もしstdClassではなく連想配列として扱いたい場合は、json_decodeの第二引数にtrueを指定してください。

PHPでjson_decode構文エラーを検出する

1<?php
2
3/**
4 * 無効なJSON文字列をjson_decodeで処理し、構文エラーを検出するサンプル関数。
5 *
6 * json_decode 関数は、入力されたJSON文字列をデコードします。
7 * 無効なJSONが入力された場合、json_decode は null を返します。
8 * その後、json_last_error() と json_last_error_msg() 関数を使用することで、
9 * 具体的なエラーの種類とメッセージを取得し、エラー処理を行うことができます。
10 *
11 * @param string $jsonString デコードを試みるJSON文字列
12 *   - $json: デコードするJSON文字列。
13 *   - $associative: true を設定すると、JSONオブジェクトを連想配列として返します。
14 *                    false を設定すると、stdClassオブジェクトとして返します。
15 *                    null (デフォルト) の場合、オブジェクトとして返します。
16 *   - $depth: 最大のネストの深さ。デフォルトは512。
17 *   - $flags: デコードオプションのビットマスク。
18 * @return array|object|null デコードが成功した場合はデコードされたデータ(配列またはオブジェクト)、
19 *                           デコードに失敗した場合は null を返します。
20 */
21function decodeJsonAndHandleSyntaxError(string $jsonString)
22{
23    echo "デコードを試みるJSON文字列:\n";
24    echo $jsonString . "\n\n";
25
26    // json_decode を使用してJSON文字列をデコードします。
27    // 第2引数を true に設定すると、JSONオブジェクトをPHPの連想配列としてデコードします。
28    $decodedData = json_decode($jsonString, true);
29
30    // json_last_error() を使用して、直前のJSON操作でエラーが発生したかを確認します。
31    // JSON_ERROR_NONE はエラーがないことを示します。
32    if (json_last_error() !== JSON_ERROR_NONE) {
33        // エラーが発生した場合
34        $errorCode = json_last_error();
35        $errorMessage = json_last_error_msg();
36
37        // 特に JSON_ERROR_SYNTAX(構文エラー)の場合を強調します。
38        // これは、JSON文字列の形式が正しくない場合に発生します。
39        if ($errorCode === JSON_ERROR_SYNTAX) {
40            echo "エラー: JSON構文エラーを検出しました。\n";
41        } else {
42            echo "エラー: JSONデコード中に問題が発生しました。\n";
43        }
44        echo "  エラーコード: {$errorCode}\n";
45        echo "  エラーメッセージ: {$errorMessage}\n";
46
47        // エラー発生時は null を返すことで、呼び出し元にデコードが失敗したことを通知します。
48        return null;
49    }
50
51    // デコードが成功した場合、結果を表示します。
52    // (注意: 入力が有効なJSON "null" であった場合も $decodedData は null となりますが、
53    //        その場合は json_last_error() が JSON_ERROR_NONE であるため、
54    //        このブロックに入ります。)
55    echo "JSONデコードが成功しました。\n";
56    print_r($decodedData);
57
58    return $decodedData;
59}
60
61// --- サンプル使用例 ---
62
63// 無効なJSON文字列の例:
64// - ダブルクォートが閉じられていない ("age": 30 の後)
65// - 末尾の閉じ波括弧が欠落している
66// これらは典型的なJSONの構文エラーを引き起こします。
67$invalidJson = '{"name": "Alice", "age": 30';
68
69decodeJsonAndHandleSyntaxError($invalidJson);
70
71?>

PHPのjson_decode関数は、JSON形式の文字列をPHPのデータ型(配列やオブジェクト)に変換するために使用されます。第一引数にはデコードしたいJSON文字列を指定し、第二引数にtrueを設定するとJSONオブジェクトをPHPの連想配列として、falseまたは省略するとPHPのオブジェクトとしてデコードします。このサンプルコードでは、意図的に無効なJSON文字列をjson_decodeに与えた際の挙動と、そのエラーを適切に処理する方法を示しています。

json_decodeは、入力されたJSON文字列が正しくない場合、nullを返します。このとき、直前のJSON操作で発生したエラーの種類はjson_last_error()関数で取得でき、より詳細なエラーメッセージはjson_last_error_msg()関数で確認できます。特に、JSONの形式がルールに沿っていない構文エラー(JSON_ERROR_SYNTAX)が発生した場合、これらの関数によってエラーコードとメッセージを取得し、具体的な問題を特定できます。

サンプルコードでは、閉じられていないダブルクォートや不足している閉じ括弧を持つ無効なJSON文字列をデコードする際にjson_last_error()JSON_ERROR_NONEではないことを検出し、エラーコードとメッセージを表示しています。これにより、デコードが失敗した理由を明確に把握し、適切なエラーハンドリングを行うことができます。関数は成功時にはデコードされたデータ、失敗時にはnullを返します。

json_decode関数はデコードに失敗するとnullを返しますが、有効なJSON文字列"null"の場合もnullとなるため、戻り値だけでエラーと判断せず、必ずjson_last_error()でエラーコードがJSON_ERROR_NONEではないことを確認してください。エラー発生時はjson_last_error_msg()で具体的なエラーメッセージを取得し、適切なエラーハンドリングを行うことが重要です。特にJSON_ERROR_SYNTAXは、JSONの記述形式が正しくない場合によく発生するため、入力JSONの構文を確認しましょう。また、第2引数$associativetrueにするとデコード結果がPHPの連想配列となり、省略またはfalseの場合はオブジェクトとして扱われます。どちらの形式でデータを受け取りたいか意識して指定してください。

PHPでJSONを配列に変換する

1<?php
2
3// JSON文字列を配列に変換するサンプル
4$json_string = '{"name": "John Doe", "age": 30, "city": "New York"}';
5
6// json_decode関数を使ってJSON文字列を配列に変換
7$array_data = json_decode($json_string, true);
8
9// 結果を出力
10if ($array_data !== null) {
11    echo "Name: " . $array_data['name'] . PHP_EOL;
12    echo "Age: " . $array_data['age'] . PHP_EOL;
13    echo "City: " . $array_data['city'] . PHP_EOL;
14} else {
15    echo "JSONデコードに失敗しました。" . PHP_EOL;
16}
17
18// JSON文字列をオブジェクトに変換するサンプル($associativeを省略した場合)
19$json_string = '{"name": "Jane Doe", "age": 25, "city": "Los Angeles"}';
20
21// json_decode関数を使ってJSON文字列をオブジェクトに変換
22$object_data = json_decode($json_string);
23
24// 結果を出力
25if ($object_data !== null) {
26    echo "Name: " . $object_data->name . PHP_EOL;
27    echo "Age: " . $object_data->age . PHP_EOL;
28    echo "City: " . $object_data->city . PHP_EOL;
29} else {
30    echo "JSONデコードに失敗しました。" . PHP_EOL;
31}

PHPのjson_decode関数は、JSON形式の文字列をPHPの変数(配列またはオブジェクト)に変換するために使用します。この関数は、システムエンジニアを目指す方がAPI連携やデータ処理を行う上で非常に重要な役割を果たします。

第一引数 $json には、デコードしたいJSON形式の文字列を渡します。第二引数 $associative はオプションで、true を指定すると連想配列として、false または省略した場合はオブジェクトとして結果を返します。サンプルコードでは、true を指定して配列に変換する例と、省略してオブジェクトに変換する例を示しています。

第三引数 $depth は、デコードするJSONの深さの最大値を指定します。デフォルト値は512です。第四引数 $flags は、JSONデコード時のオプションを指定します。

この関数は、成功した場合はデコードされたPHPの変数(配列またはオブジェクト)を、失敗した場合は null を返します。サンプルコードでは、戻り値が null でないかを確認することで、デコードが成功したかどうかをチェックしています。

配列としてデコードされた場合、$array_data['name'] のようにキーを指定して値にアクセスできます。オブジェクトとしてデコードされた場合は、$object_data->name のようにプロパティを指定して値にアクセスします。JSONの構造に合わせて適切な方法でデータにアクセスしてください。

json_decode関数は、JSON形式の文字列をPHPのデータ構造(配列またはオブジェクト)に変換します。第二引数$associativetrueにすると、JSONオブジェクトが連想配列として返されます。省略した場合(またはfalseの場合)は、オブジェクトとして返されます。JSONデコードに失敗した場合(無効なJSON文字列など)、nullが返されるため、必ず!== nullで結果を確認しましょう。第三引数$depthは、JSONのネストの深さの制限を設定します。第四引数$flagsは、挙動を制御するためのフラグです。例えば、JSON_THROW_ON_ERRORフラグを使うと、エラー時に例外をスローできます。

関連コンテンツ