ラボ > PHP:HTML、Javascript絡み

PHP JSONの変換

JSONの文字列を配列にしたり、その逆をしたり。json_encode()、json_decode()

作成日:2017-12-20, 更新日:2018-09-05

基本

・JSONの文字列を変換 - json_decode()
・JSONの文字列に変換 - json_encode()

文字列を配列にする 配列を文字列にする
PHP json_decode() json_encode()
JQUERY JSON.parse() JSON.stringify()

JSONの文字列を(配列やオブジェクトに)変換 / json_decode()

オブジェクトに変換

$jsonTxt = 〇〇〇〇;
$obj = json_decode($jsonTxt);

配列に変換

$jsonTxt = 〇〇〇〇;
$obj = json_decode($jsonTxt, true);

DBから取得したデータをjson_decode()でエラー

原因は不明。でも解決策はあるっぽい。

$obj = json_decode(str_replace('"', '"', $jsonTxt), true);

(配列やオブジェクトを)JSONの文字列に変換 / json_encode

$ary = array(〇〇〇=>〇〇〇, 〇〇〇=>〇〇〇);
$obj = json_encode($ary);

日本語絡み

日本語の入ったデータを「json_encode()」にいれると「\u3042」などのような文字コードに変換される。
「json_decode()」すれば元の日本語に戻るんだけど、ちょっとした確認用に「json_encode()」する場合は不便だったりする。

▼文字コードに変換せずに日本語のままJSONに変換

$jsonTxt = json_encode(配列やオブジェクト, JSON_UNESCAPED_UNICODE);

エラー処理

「json_last_error()」をすれば確認可能。

▼エラーの有無のみ

$ary = json_decode(〇〇〇);
if ( !json_last_error() ) {
   echo 'エラーなし';
}
else {
   echo 'エラーあり';
}

▼エラー内容あり

function getJsonErr() {
   switch (json_last_error()) {
      case JSON_ERROR_NONE: // ※「var_dump(JSON_ERROR_NONE)=0」
         $result = 'no error';
      break;
      
      case JSON_ERROR_DEPTH:
         $result = 'Maximum stack depth exceeded';
      break;
      
      case JSON_ERROR_STATE_MISMATCH:
         $result = 'Underflow or the modes mismatch';
      break;
      
      case JSON_ERROR_CTRL_CHAR:
         $result = 'Unexpected control character found';
      break;
      
      case JSON_ERROR_SYNTAX:
         $result = 'Syntax error, malformed JSON';
      break;
      
      case JSON_ERROR_UTF8:
         $result = 'Malformed UTF-8 characters, possibly incorrectly encoded';
      break;
      
      default:
         $result = 'Unknown error';
      break;
   }
   
   return $result;
}

$ary = json_decode(〇〇〇);
echo getJsonErr();
定数 意味 使用可能
JSON_ERROR_NONE エラーは発生しませんでした
JSON_ERROR_DEPTH スタックの深さの最大値を超えました
JSON_ERROR_STATE_MISMATCH JSON の形式が無効、あるいは壊れています
JSON_ERROR_CTRL_CHAR 制御文字エラー。おそらくエンコーディングが違います
JSON_ERROR_SYNTAX 構文エラー
JSON_ERROR_UTF8 正しくエンコードされていないなど、不正な形式の UTF-8 文字 PHP 5.3.3
JSON_ERROR_RECURSION エンコード対象の値に再帰参照が含まれています PHP 5.5.0
JSON_ERROR_INF_OR_NAN エンコード対象の値に NAN あるいは INF が含まれています。 PHP 5.5.0
JSON_ERROR_UNSUPPORTED_TYPE エンコード不可能な型の値が渡されました PHP 5.5.0
JSON_ERROR_INVALID_PROPERTY_NAME A property name that cannot be encoded was given PHP 7.0.0
JSON_ERROR_UTF16 Malformed UTF-16 characters, possibly incorrectly encoded PHP 7.0.0

関連項目

jquery JSONの相互変換