PHP: json_encode, json_decodeのエラーを取得


json_encode,json_decodeのエラーを検出する

json_decodeはjsonでエンコードされたデータを、適切な PHP の型として返します。
true、false および null はそれぞれ TRUE、FALSE そして NULL として返されます
json のデコードに失敗したりエンコードされたデータが再帰制限を超えているなどの場合、NULLを返します。

すなわち、json_decodeの結果が NULL であった場合、JSONの”null”を正しく変換してNULLなのか、変換に失敗してNULLなのかは解らない。
(ただし、正しい処理の中でNULLという変換結果がありえない場合は無視できる)


$text = "null"; // NULLに変換されるべき文字列
$data1 = json_decode($text);
var_dump($data1); // NULL

$text = '['; // JSONとして妥当ではない文字列
$data2 = json_decode($text); // NULL

エラー無しで変換できたかを確認するには json_last_error を使う。
json_last_errorは直近の JSON エンコード/デコード処理中に発生したエラー (もし存在すれば) を返す関数である。


// json_encode,json_decodeでエラーが発生していないか確認
if(json_last_error() !== JSON_ERROR_NONE){
    // エラーが発生
}
else{
    // エラー無し
}

変換元のデータにNANやINF、再帰参照が含まれている場合などjson_encodeも失敗するがことがあり得る。
json_encodeのエラーも同じくjson_last_errorで取得できる。

json_last_errorのエラーコード

json_last_errorは整数の値を返す。その値は次の定数のいずれかとなる。

JSON_ERROR_NONE
エラーは発生しませんでした
JSON_ERROR_DEPTH
スタックの深さの最大値を超えました
JSON_ERROR_STATE_MISMATCH
JSON の形式が無効、あるいは壊れています
JSON_ERROR_CTRL_CHAR
制御文字エラー。おそらくエンコーディングが違います
JSON_ERROR_SYNTAX
構文エラー
JSON_ERROR_UTF8
正しくエンコードされていないなど、不正な形式の UTF-8 文字
JSON_ERROR_RECURSION
エンコード対象の値に再帰参照が含まれています
JSON_ERROR_INF_OR_NAN
エンコード対象の値に NAN あるいは INF が含まれています。
JSON_ERROR_UNSUPPORTED_TYPE
エンコード不可能な型の値が渡されました

エラーメッセージを取得する

直近の json_encode() や json_decode() の呼び出しのエラー文字列を返す関数はjson_last_error_msgである。


if(json_last_error() !== JSON_ERROR_NONE){
    // エラーが発生
    print json_last_error_msg(); // エラーメッセージを出力
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です