【PHP8.x】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)

json_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配列・オブジェクトへ変換する

<?php

/**
 * json_decode のサンプルコード
 */

// JSON 文字列
$json_string = '{"name": "太郎", "age": 30, "city": null}';

// json_decode を使用して PHP の連想配列に変換
$associative_array = json_decode($json_string, true);

// 結果の確認
if ($associative_array === null && json_last_error() !== JSON_ERROR_NONE) {
    // JSON デコードエラーが発生した場合
    echo 'JSON デコードエラー: ' . json_last_error_msg() . PHP_EOL;
} else {
    // デコード成功
    echo "名前: " . $associative_array['name'] . PHP_EOL;
    echo "年齢: " . $associative_array['age'] . PHP_EOL;
    echo "都市: " . ($associative_array['city'] ?? 'N/A') . PHP_EOL; // null 合体演算子を使用
}

// オブジェクトとしてデコードする場合 (第2引数を省略または false にする)
$object = json_decode($json_string);

// オブジェクトの場合のプロパティへのアクセス
if ($object !== null && json_last_error() === JSON_ERROR_NONE) {
    echo "名前 (オブジェクト): " . $object->name . PHP_EOL;
    echo "年齢 (オブジェクト): " . $object->age . PHP_EOL;
    echo "都市 (オブジェクト): " . ($object->city ?? 'N/A') . PHP_EOL;
}

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を配列に変換する

<?php

// JSON文字列を配列に変換するサンプル
$json_string = '{"name": "John Doe", "age": 30, "city": "New York"}';

// json_decode関数を使ってJSON文字列を配列に変換
$array_data = json_decode($json_string, true);

// 結果を出力
if ($array_data !== null) {
    echo "Name: " . $array_data['name'] . PHP_EOL;
    echo "Age: " . $array_data['age'] . PHP_EOL;
    echo "City: " . $array_data['city'] . PHP_EOL;
} else {
    echo "JSONデコードに失敗しました。" . PHP_EOL;
}

// JSON文字列をオブジェクトに変換するサンプル($associativeを省略した場合)
$json_string = '{"name": "Jane Doe", "age": 25, "city": "Los Angeles"}';

// json_decode関数を使ってJSON文字列をオブジェクトに変換
$object_data = json_decode($json_string);

// 結果を出力
if ($object_data !== null) {
    echo "Name: " . $object_data->name . PHP_EOL;
    echo "Age: " . $object_data->age . PHP_EOL;
    echo "City: " . $object_data->city . PHP_EOL;
} else {
    echo "JSONデコードに失敗しました。" . PHP_EOL;
}

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フラグを使うと、エラー時に例外をスローできます。

【PHP8.x】json_decode関数の使い方 | いっしー@Webエンジニア