json_last_error関数の使い方

json_last_error関数は、直近のJSONエンコード/デコード処理中に発生したエラーを返します。
返り値は整数の値で、以下の定数になります。

0 JSON_ERROR_NONE:エラーは発生しませんでした
1 JSON_ERROR_DEPTH:スタックの深さの最大値を超えました
2 JSON_ERROR_STATE_MISMATCH:JSONの形式が無効、あるいは壊れています
3 JSON_ERROR_CTRL_CHAR:制御文字エラー。おそらくエンコーディングが違います
4 JSON_ERROR_SYNTAX:構文エラー
5 JSON_ERROR_UTF8:正しくエンコードされていないなど、不正な形式のUTF-8文字

以下の連想配列をjson_encode関数でJSON形式の文字列に変換し、エラーがない場合のみ出力します。最初はエラーを発生させるために、mb_convert_encoding関数で文字コードをUTF-8からSJISに変換します。

<?php
$list = array(
  'web' => 'http://shop.jp/',
  'item' => array(
    'トマト' => 100,
    'キャベツ' => 120,
    'ピーマン' => 80,
  ),
);

$list = mb_convert_encoding($list, "SJIS", "UTF-8");
$jsonstr = json_encode($list, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

$json_error = json_last_error();
var_dump($json_error);
echo json_last_error_msg();

if($json_error === JSON_ERROR_NONE) :
  print_r($jsonstr);
endif;
?>

実行結果は以下の通りです。
json_last_error関数の返り値は「5」で、定数は「JSON_ERROR_UTF8」です。json_last_error_msg関数でエラーメッセージが表示できます。
エラーが発生しているため、JSON出力部分は実行されません。

int(5)
Malformed UTF-8 characters, possibly incorrectly encoded

次に、文字コード変換の処理部分をコメントアウトします。

<?php
$list = array(
  'web' => 'http://shop.jp/',
  'item' => array(
    'トマト' => 100,
    'キャベツ' => 120,
    'ピーマン' => 80,
  ),
);

//$list = mb_convert_encoding($list, "SJIS", "UTF-8");
$jsonstr = json_encode($list, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

$json_error = json_last_error();
var_dump($json_error);
echo json_last_error_msg();

if($json_error === JSON_ERROR_NONE) :
  print_r($jsonstr);
endif;
?>

実行結果は以下の通りです。
json_last_error関数の返り値は「0」で、定数は「JSON_ERROR_NONE」です。
結果、JSON出力部分が実行されます。

int(0)
No error

{
  "web": "http://shop.jp/",
  "item": {
    "トマト": 100,
    "キャベツ": 120,
    "ピーマン": 80
  }
}
タイトルとURLをコピーしました