PHP json_decode() 傳回 NULL 的解法

PHP 使用 json_decode() 來解開 json, json 有資料, 但是卻傳回 NULL, 要如何 Debug 呢?

PHP json_decode() 傳回 NULL 的解法

PHP 使用 json_decode() 解開 json, 回傳 null, 於是先來看看 json 有什麼錯誤訊息.

註: 確定 json 格式是正確的.

可以使用此 Function json_last_error() 來看 json_decode() 到底發生什麼事情.

但是 json_last_error() 出來的值是數字, 無法直接對照看出錯誤訊息, 於此頁找到 PHP: json_last_error_msg 此 Function 直接取用.(PHP 5.5以上可直接使用, 不需要下述 Function)

<?php
function json_last_error_msg() {
    static $errors = array(
        JSON_ERROR_NONE           => null,
        JSON_ERROR_DEPTH          => 'Maximum stack depth exceeded',
        JSON_ERROR_STATE_MISMATCH => 'Underflow or the modes mismatch',
        JSON_ERROR_CTRL_CHAR      => 'Unexpected control character found',
        JSON_ERROR_SYNTAX         => 'Syntax error, malformed JSON',
        JSON_ERROR_UTF8           => 'Malformed UTF-8 characters, possibly incorrectly encoded'
    );
    $error = json_last_error();
    return array_key_exists($error, $errors) ?  $errors[$error] : "Unknown error ({$error})";
}
?>

範例

<?php
var_dump(json_decode($json_data)); // null
echo json_last_error() . "\n"; // 4
echo json_last_error_msg() . "\n"; // Syntax error, malformed JSON
?>

由上述得之, 錯誤訊息是 "Syntax error, malformed JSON", 問題是那格式是正確的, 後來想到因為 API 是 aspx、ashx, 可能會有 BOM(回傳有中文), 於是使用此篇 "PHP 判斷/移除 BOM(UTF-8)" 得 Function 先將 $json_data 過濾一次, 再來解開就可以動了.

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料