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

【PHP8.x】JSON_ERROR_NONE定数の使い方

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

作成日: 更新日:

基本的な使い方

JSON_ERROR_NONE定数は、PHPのJSON拡張機能において、JSON形式のデータのエンコード(変換)やデコード(解析)といった操作が、エラーなく正常に完了した状態を表す定数です。この定数は、JSON関連の関数(例えば json_encode()json_decode() など)を実行した後に、その操作が成功したかどうかを確認するために利用されます。

具体的には、直前のJSON操作で何らかのエラーが発生したかどうかを判定する json_last_error() 関数が呼び出された際、その戻り値が JSON_ERROR_NONE と等しい場合、エラーは一切発生しなかったと判断できます。この定数の内部的な値は 0 ですが、数値そのものを直接使うよりも、JSON_ERROR_NONE という定数名を用いることで、コードの意図が明確になり、可読性が向上します。

システムエンジニアを目指す方にとって、JSONデータの送受信や処理は日常的に発生します。そのため、データの整合性を保ち、アプリケーションの信頼性を確保するためには、JSON操作が正しく行われたかを常に検証することが重要です。JSON_ERROR_NONE 定数は、このエラーチェックプロセスにおいて、処理が成功した状態を明示的に示すための、非常に基本的ながらも不可欠な要素となります。エラーが発生しなかったことを確実に判断することで、その後の処理を安全に進めることが可能になります。

構文(syntax)

1<?php
2if (json_last_error() === JSON_ERROR_NONE) {
3}
4?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

JSON_ERROR_NONE は、JSON エンコードまたはデコード処理が正常に完了したことを示す定数です。この定数は整数値 0 で表現されます。

サンプルコード

PHP: JSON_ERROR_NONEでjson_encodeエラーをチェックする

1<?php
2
3/**
4 * JSON_ERROR_NONE 定数を使ったjson_encodeのエラーチェックのサンプル関数。
5 *
6 * この関数は、json_encodeが成功した場合と失敗した場合の両方で、
7 * json_last_error()関数とJSON_ERROR_NONE定数を使用してエラーをチェックする方法を示します。
8 * JSON_ERROR_NONEは、JSON関数がエラーなく実行されたことを示す整数値です。
9 */
10function demonstrateJsonEncodingErrorHandling(): void
11{
12    echo "--- 正常なデータでのJSONエンコードの例 ---\n";
13    $normalData = ['name' => 'John Doe', 'age' => 30, 'city' => 'New York'];
14    $jsonResult = json_encode($normalData);
15
16    if ($jsonResult === false) {
17        // json_encodeがfalseを返した場合、エンコードに失敗しています。
18        // 通常、正常なデータではこのブロックには入りません。
19        echo "JSONエンコードに失敗しました。\n";
20        // json_last_error()で最後のエラーコードを取得します。
21        echo "エラーコード: " . json_last_error() . "\n";
22        // json_last_error_msg()で最後のエラーメッセージを取得します。
23        echo "エラーメッセージ: " . json_last_error_msg() . "\n";
24    } else {
25        // json_encodeがJSON文字列を返した場合、エンコードに成功しています。
26        echo "JSONエンコードに成功しました。\n";
27        echo "エンコードされたJSON: " . $jsonResult . "\n";
28
29        // json_last_error()を呼び出し、エラーコードを確認します。
30        $errorCode = json_last_error();
31        if ($errorCode === JSON_ERROR_NONE) {
32            // JSON_ERROR_NONE はエラーがないことを示します。
33            echo "エラーコードは JSON_ERROR_NONE です (コード: " . $errorCode . ")。\n";
34        } else {
35            // ここに到達した場合、エンコードは成功したものの、何らかの予期せぬエラーが報告されていることになります。
36            echo "予期せぬエラーが発生しました (コード: " . $errorCode . "):" . json_last_error_msg() . "\n";
37        }
38    }
39
40    echo "\n--- エラーを意図的に引き起こすJSONエンコードの例 ---\n";
41    // PHPは、自身を参照するような循環参照を持つオブジェクトをJSONエンコードできません。
42    // これはjson_encodeが失敗する典型的な例です。
43    $errorData = new stdClass();
44    $errorData->a = $errorData; // ここでオブジェクト自身への循環参照を作成します。
45
46    $jsonErrorResult = json_encode($errorData);
47
48    if ($jsonErrorResult === false) {
49        // json_encodeがfalseを返したため、エンコードに失敗しています。
50        echo "JSONエンコードに失敗しました (循環参照によりエラー発生)。\n";
51        $errorCode = json_last_error();
52        echo "エラーコード: " . $errorCode . "\n";
53        echo "エラーメッセージ: " . json_last_error_msg() . "\n";
54
55        // エラーが発生したので、エラーコードは JSON_ERROR_NONE 以外であることを確認します。
56        if ($errorCode !== JSON_ERROR_NONE) {
57            echo "エラーコードは JSON_ERROR_NONE ではありません。\n";
58        } else {
59            // このブロックに到達した場合、エンコードは失敗したのにエラーコードが
60            // JSON_ERROR_NONE であるという論理的な矛盾が発生しています。
61            echo "予期しない状態: エンコード失敗にも関わらずエラーコードが JSON_ERROR_NONE です。\n";
62        }
63    } else {
64        // このパスは通常実行されません(循環参照があるため)。
65        echo "JSONエンコードは成功しました (エラーを期待したが成功)。\n";
66        echo "エンコードされたJSON: " . $jsonErrorResult . "\n";
67    }
68}
69
70// サンプル関数を実行して、動作を確認します。
71demonstrateJsonEncodingErrorHandling();

PHP 8で提供されるJSON_ERROR_NONEは、JSON関連の関数(例: json_encodejson_decode)が実行された際に、エラーが一切発生しなかったことを示すための整数値の定数です。この定数には引数はなく、常に整数型(int)の値を返します。

この定数は、json_encodeなどの関数実行後に処理の成功・失敗をチェックする際に非常に役立ちます。例えば、json_encodeが成功してJSON文字列を返した場合、その直後に呼び出すjson_last_error()関数はJSON_ERROR_NONEと同じ値を返します。これは、エンコード処理が正常に完了したことを明確に示します。

もしjson_encodeが失敗してfalseを返した場合、json_last_error()JSON_ERROR_NONEとは異なる、具体的なエラーを示す整数値を返します。このエラーコードとJSON_ERROR_NONEを比較することで、処理が成功したか失敗したかを確実に判断できます。さらに、json_last_error_msg()関数を使えば、エラーコードに対応するより詳細なエラーメッセージも取得可能です。サンプルコードでは、正常なデータと意図的にエラーを発生させるデータの両方で、json_encodeの動作と、それに続くjson_last_error()およびJSON_ERROR_NONEを使ったエラーチェックの挙動を確認しています。json_last_error()の結果がJSON_ERROR_NONEであれば成功、そうでなければエラーが発生していると判断できます。

PHPのjson_encodeでエラーをチェックする際は、まず戻り値がfalseかどうかを確認することが重要です。falseが返された場合、エンコードに失敗しています。このとき、直ちにjson_last_error()を呼び出してエラーコードを取得し、json_last_error_msg()で具体的なエラーメッセージを確認してください。JSON_ERROR_NONE定数は、JSON関数がエラーなく正常に完了したことを示します。したがって、json_encodeが成功してJSON文字列が返された場合でも、念のためjson_last_error()JSON_ERROR_NONEであることを確認すると、予期せぬ問題がなかったことをより確実に判断できます。エラーコードとメッセージをセットで扱うことで、問題の原因特定が容易になります。

PHPでJSONデコードエラーをチェックする

1<?php
2
3/**
4 * JSON文字列をデコードし、その処理中にエラーが発生したかどうかを確認する関数です。
5 * システムエンジニアを目指す初心者向けに、json_decode のエラーハンドリングの基本を示します。
6 *
7 * @param string $jsonString デコードを試みるJSON文字列。
8 * @return mixed|null デコードに成功した場合は結果のデータ (連想配列)、失敗した場合は null を返します。
9 */
10function decodeJsonAndCheckError(string $jsonString): mixed
11{
12    echo "--- デコード対象JSON ---\n";
13    echo $jsonString . "\n\n";
14
15    // JSON文字列をPHPの連想配列にデコードします。
16    // 第2引数を true にすると、オブジェクトではなく連想配列としてデコードされます。
17    $decodedData = json_decode($jsonString, true);
18
19    // 直前の JSON 操作で発生したエラーコードを取得します。
20    $errorCode = json_last_error();
21
22    // エラーコードが JSON_ERROR_NONE (エラーなし) かどうかを確認します。
23    // JSON_ERROR_NONE はエラーがないことを示す整数値です。
24    if ($errorCode === JSON_ERROR_NONE) {
25        echo "✅ JSONデコード成功!エラーはありませんでした。\n";
26        echo "デコード結果:\n";
27        print_r($decodedData);
28        return $decodedData;
29    } else {
30        // エラーが発生した場合、その詳細を表示します。
31        echo "❌ JSONデコード失敗!エラーが発生しました。\n";
32        echo "エラーコード: " . $errorCode . "\n";
33        echo "エラーメッセージ: " . json_last_error_msg() . "\n";
34        return null;
35    }
36    echo "\n"; // 結果の区切りとして空行を出力
37}
38
39// --- 関数の使用例 ---
40
41// 1. 正常なJSON文字列の場合
42echo "=== 例1: 正常なJSON文字列 ===\n";
43$validJson = '{"name": "Alice", "age": 30, "city": "New York"}';
44decodeJsonAndCheckError($validJson);
45
46echo "\n";
47
48// 2. 不正なJSON文字列の場合 (構文エラー: 末尾のカンマ)
49echo "=== 例2: 不正なJSON文字列 (構文エラー) ===\n";
50$invalidJson = '{"item": "Laptop", "price": 1200,}'; // オブジェクトの最後に不要なカンマがある
51decodeJsonAndCheckError($invalidJson);
52
53echo "\n";
54
55// 3. 別の不正なJSON文字列の場合 (引用符の欠落)
56echo "=== 例3: 不正なJSON文字列 (引用符の欠落) ===\n";
57$anotherInvalidJson = '{"product": "Mouse", "quantity": 5'; // 閉じ波括弧と引用符が不足
58decodeJsonAndCheckError($anotherInvalidJson);
59
60?>

このPHPコードは、JSON形式の文字列をPHPのデータに変換(デコード)する際に、エラーが発生したかどうかを確認する基本的な方法を示しています。まず、json_decode()関数を用いてJSON文字列をPHPの連想配列に変換します。この関数の第2引数にtrueを設定することで、JSONオブジェクトがPHPの連想配列として扱われます。デコードに成功した場合、変換されたデータが返されますが、失敗した場合はnullが返されることがあります。

デコード処理の直後には、json_last_error()関数を呼び出し、直前のJSON操作で発生したエラーのコード(整数値)を取得します。この取得したエラーコードが、PHPに定義されている定数JSON_ERROR_NONEと一致するかどうかをif文で判定することが重要です。JSON_ERROR_NONEは、JSON処理が完全に成功し、エラーが一切発生しなかったことを示す特別な値です。

もしエラーコードがJSON_ERROR_NONEであれば、デコードは成功と判断され、結果のデータが表示されます。一方で、JSON_ERROR_NONE以外の値が返された場合はエラーが発生しており、その際にはjson_last_error_msg()関数を使用することで、具体的なエラー内容を示すメッセージを取得できます。これにより、エラーコードとメッセージの両方から問題の原因を特定し、適切に対処することが可能になります。このように、JSON処理におけるエラーハンドリングはシステムの堅牢性を高める上で不可欠な要素です。

json_decode関数は、デコードに失敗してもPHPが自動でエラー停止しないため、処理の安全性を確保するためには、必ずjson_last_error()でエラーコードを確認する習慣が非常に重要です。エラーがない場合はJSON_ERROR_NONEという定数が返されますので、この値と比較することで、デコードが成功したかを確実に判断できます。万が一エラーが発生した際には、json_last_error_msg()を利用して具体的なエラーメッセージを取得し、問題の原因を特定する手助けとして活用してください。また、json_decodeの第2引数にtrueを渡すと、結果が連想配列として得られますが、指定しない場合はオブジェクトとなるため、データの取り扱いに合わせて適切に選択することが大切です。不正なJSONデータはシステムの脆弱性につながる可能性もあるため、これらのエラーハンドリングはセキュリティの観点からも不可欠です。

関連コンテンツ

関連プログラミング言語