【PHP8.x】JsonException::lineプロパティの使い方
lineプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
lineプロパティは、JsonExceptionがスローされたソースコードの行番号を保持するプロパティです。このプロパティは、PHPの基本的な例外クラスであるExceptionから継承されています。JsonExceptionは、json_encode()やjson_decode()関数などでJSONデータの処理中にエラーが発生した場合にスローされる例外です。例えば、構文的に正しくないJSON文字列をデコードしようとした場合などにこの例外が発生します。その際、lineプロパティには、エラーの原因となったコードが記述されているソースファイル上の具体的な行番号が整数値として自動的に格納されます。この行番号情報を利用することで、開発者はプログラムのどこでJSON関連の問題が起きているのかを迅速かつ正確に特定でき、デバッグ作業を効率的に進めることが可能になります。通常、このプロパティの値はtry-catch構文でJsonExceptionオブジェクトを捕捉し、そのオブジェクトのgetLine()メソッドを呼び出すことで取得します。この値はPHPエンジンによって例外発生時に設定されるため、開発者が手動で変更することはありません。
構文(syntax)
1<?php 2 3$invalidJson = '{"key": "value",}'; 4 5try { 6 json_decode($invalidJson, true, 512, JSON_THROW_ON_ERROR); 7} catch (JsonException $e) { 8 // 例外がスローされたPHPコードの行番号を取得します。 9 $errorLine = $e->getLine(); 10 echo $errorLine; 11}
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
JsonException クラスの line プロパティは、JSON 解析中にエラーが発生した行番号を整数で返します。
サンプルコード
PHP JsonException line エラー送信する
1<?php 2 3/** 4 * JSON文字列をデコードし、エラー発生時にその情報を行番号と共に送信します。 5 * 6 * JsonExceptionが持つ`line`プロパティ(getLine()メソッドで取得)は、 7 * JSON文字列内のエラー行ではなく、このPHPスクリプト内で 8 * 例外が発生した行(json_decode()が呼び出された行)を指します。 9 * 10 * @param string $jsonString デコード対象のJSON文字列 11 * @return void 12 */ 13function decodeJsonAndSendError(string $jsonString): void 14{ 15 try { 16 // JSON_THROW_ON_ERRORフラグを使い、パースエラー時にJsonExceptionをスローさせます。 17 json_decode($jsonString, true, 512, JSON_THROW_ON_ERROR); 18 19 echo "JSONのデコードに成功しました。" . PHP_EOL; 20 } catch (JsonException $e) { 21 // JsonExceptionをキャッチして、エラー情報を組み立てます。 22 $errorMessage = sprintf( 23 "JSONエラーを検知し、情報を送信します。\n" . 24 " - ファイル: %s\n" . 25 " - 発生行: %d\n" . // エラーが発生したスクリプトの行番号を取得 26 " - エラー内容: %s\n", 27 $e->getFile(), 28 $e->getLine(), 29 $e->getMessage() 30 ); 31 32 // 組み立てたエラーメッセージを「送信」します。 33 // このサンプルでは、エラーログに出力することで送信を表現しています。 34 error_log($errorMessage); 35 } 36} 37 38// 3行目に構文エラー(末尾のカンマ)を持つ不正なJSON文字列 39$invalidJson = <<<JSON 40{ 41 "user": "Alice", 42 "id": 100, 43} 44JSON; 45 46// 関数を呼び出してエラーを発生させ、その情報を出力します。 47decodeJsonAndSendError($invalidJson); 48
このPHPサンプルコードは、JSON文字列をデコードする際にエラーが発生した場合、そのエラー情報を取得して送信する処理を実演します。
decodeJsonAndSendErrorという関数は、引数としてデコード対象のJSON文字列$jsonStringを受け取ります。この関数は特定の値を返さないため、戻り値はありません。
関数内部では、try...catch構文が使われています。まずtryブロック内でjson_decode()関数を実行します。このとき、第4引数にJSON_THROW_ON_ERRORフラグを指定しているため、JSONの形式に誤りがあるとJsonExceptionという種類の例外が発生します。
例外が発生すると処理はcatchブロックに移り、JsonExceptionオブジェクト(変数$e)を捕捉します。このオブジェクトが持つgetLine()メソッドは、引数を取らず、例外が発生したPHPスクリプト内の行番号を整数(int)で返します。このサンプルではjson_decode()が記述されている行番号が該当します。getFile()でファイル名、getMessage()でエラー内容も取得し、これらの情報を組み合わせてエラーメッセージを組み立てます。
最後に、作成したエラーメッセージをerror_log()関数で出力します。これは、エラー情報をログファイルなどに「送信」する処理を模擬したものです。このコードは、JSONのパースエラーを検知し、その発生箇所を正確に特定して記録する方法を示しています。
JsonExceptionからgetLine()で取得できる行番号は、JSON文字列内のエラー箇所ではなく、PHPコード上で例外が発生した行、つまりjson_decode()関数を呼び出した行の番号を指す点に注意が必要です。JSON自体のどこに構文エラーがあるかを示すものではありません。この例外処理を有効にするには、json_decode()の第4引数にJSON_THROW_ON_ERRORを指定することが必須です。この指定がないと、エラー時に例外は発生せずnullが返されます。また、サンプルコードにあるエラー情報の「送信」は、実際にはerror_log()によるログ出力ですが、実際の開発では、この部分を外部の監視サービスへの通知や開発者へのメール送信などに置き換えて使用します。
PHP JsonExceptionのlineプロパティでエラー行を特定する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * LINE Messaging APIからのWebhookリクエストを処理するサンプル関数。 7 * 8 * 不正な形式のJSONデータを受け取った場合にJsonExceptionを捕捉し、 9 * エラーが発生した行番号を特定する方法を示します。 10 * 11 * @param string $jsonPayload Webhookで受信したJSON文字列 12 * @return void 13 */ 14function processLineWebhook(string $jsonPayload): void 15{ 16 try { 17 // JSON_THROW_ON_ERRORオプションを指定してjson_decodeを実行します。 18 // これにより、JSONのパースエラー時にJsonExceptionがスローされます。 19 $webhookData = json_decode($jsonPayload, true, 512, JSON_THROW_ON_ERROR); 20 21 echo "Webhookデータのパースに成功しました。" . PHP_EOL; 22 // 実際には、ここで$webhookDataの内容に応じた応答処理を実装します。 23 print_r($webhookData); 24 25 } catch (JsonException $e) { 26 // JsonExceptionを捕捉した場合の処理。 27 echo "エラー: WebhookデータのJSONパースに失敗しました。" . PHP_EOL; 28 echo "メッセージ: " . $e->getMessage() . PHP_EOL; 29 30 // JsonExceptionオブジェクトのgetLine()メソッド (または public readonly プロパティ $e->line) を使用して、 31 // エラーが発生したJSON文字列内の行番号を取得します。 32 // これにより、問題の特定が容易になります。 33 echo "エラー発生行: " . $e->getLine() . PHP_EOL; 34 } 35} 36 37// --- 実行例 --- 38 39// LINEプラットフォームから送信されたと仮定する、不正なJSONデータ。 40// 6行目の `"type": "text"` の末尾にカンマが欠けているため、構文エラーが発生します。 41$invalidJsonRequest = <<<JSON 42{ 43 "destination": "Uxxxxxxxxxxxxxxxxx", 44 "events": [ 45 { 46 "type": "message", 47 "message": { 48 "type": "text" 49 "text": "Hello, world" 50 } 51 } 52 ] 53} 54JSON; 55 56// 不正なJSONデータを処理する関数を実行 57processLineWebhook($invalidJsonRequest);
JsonExceptionクラスのlineプロパティは、json_decode関数でJSON文字列の解析に失敗した際に、エラーが発生した行番号を取得するために使用します。このプロパティは引数を取らず、エラー箇所の行番号を整数(int)で返します。
この機能を利用するには、json_decode関数の第4引数にJSON_THROW_ON_ERRORオプションを指定する必要があります。これにより、JSONの解析エラーが発生した場合に、PHPはJsonExceptionという例外をスロー(送出)します。
サンプルコードでは、LINE Messaging APIからのWebhookリクエストを想定した、意図的に不正な形式にしたJSONデータを処理しています。try...catch構文を用いてjson_decodeを実行し、解析に失敗してJsonExceptionがスローされると、catchブロックでその例外オブジェクトを$eとして捕捉します。そして、$e->lineと記述することで、JSONデータ内で構文エラーが発生している具体的な行番号を取得し、表示しています。
このようにlineプロパティを活用することで、開発者はエラーの原因箇所を迅速に特定でき、デバッグ作業を効率的に進めることが可能になります。
json_decode関数でJSONパースエラーを検知するには、第4引数にJSON_THROW_ON_ERRORを指定することが必須です。この指定を忘れると例外は発生せず、エラー時にnullが返るだけなので注意してください。JsonExceptionを捕捉した際に$e->getLine()で取得できる行番号は、PHPコードの行番号ではなく、受け取ったJSON文字列内でのエラー箇所を指します。これにより、どの部分のデータ形式が不正であるかを正確に特定できます。このエラー処理はLINE連携に限りません。外部システムからJSONデータを受け取る際には常に実装することで、問題発生時の原因調査が格段に容易になります。