首頁  >  文章  >  看看PHP 7.3新版的JSON錯誤處理

看看PHP 7.3新版的JSON錯誤處理

无忌哥哥
无忌哥哥原創
2018-07-12 11:39:343662瀏覽

背景

在目前穩定的PHP V7.2中,如果你想確定JSON是無效的,你必須使用json_last_error()功能驗證:

>>> json_decode("{");
=> null
>>> json_last_error();
=> 4
>>> json_last_error() === JSON_ERROR_NONE
=> false
>>> json_last_error_msg()
=> "Syntax error"

例如,在Larave這裡檢查以確保調用JSON編碼不會導致錯誤:

// Once we get the encrypted value we'll go ahead and base64_encode the input
// vector and create the MAC for the encrypted value so we can then verify
// its authenticity. Then, we'll JSON the data into the "payload" array.
$json = json_encode(compact('iv', 'value', 'mac'));
if (json_last_error() !== JSON_ERROR_NONE) {
    throw new EncryptException('Could not encrypt the data.');
}
return base64_encode($json);

我們至少可以確定如果JSON編碼/解碼有錯誤,但相比有點笨重,拋出一個異常,放出錯誤代碼和錯誤訊息。

雖然你已經選擇了,捕捉和處理JSON,另外讓我們看看新的版本,我們可以用一個很好的方式!

在PHP 7.3錯誤標誌的拋出

隨著新的選項標誌JSON_THROW_ON_ERROR有可能改寫這一塊的程式碼使用try/catch。

也許類似下面的:

use JsonException;
try {
    $json = json_encode(compact('iv', 'value', 'mac'), JSON_THROW_ON_ERROR);
    return base64_encode($json);
} catch (JsonException $e) {
    throw new EncryptException('Could not encrypt the data.', 0, $e);
}

我認為這一新風格是特別有用的用戶代碼,當你收到一些JSON數據而不是搜尋json_last_error()和匹配的選項,JSON編碼和解碼可以利用錯誤處理程序。

這個json_decode()功能有幾個參數,並且會看起來像PHP 7.3以下如果你想利用錯誤處理:

use JsonException;
try {
    return json_decode($jsonString, $assoc = true, $depth = 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
    // Handle the JSON Exception
}
// Or even just let it bubble up...
/** 
 * Decode a JSON string into an array
 *
 * @return array
 * @throws JsonException
 */
function decode($jsonString) {
    return json_decode($jsonString, $assoc = true, $depth = 512, JSON_THROW_ON_ERROR);
}

得到的錯誤代碼和錯誤訊息

以前你取得JSON錯誤代碼和訊息使用以下功能:

// Error code
json_last_error();
// Human-friendly message
json_last_error_msg();

如果你使用新的JSON_THROW_ON_ERROR,這裡是你如何使用程式碼和取得訊息:

try {
    return json_decode($jsonString, $assoc = true, $depth = 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
    $e->getMessage(); // like json_last_error_msg()
    $e->getCode(); // like json_last_error()
}
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn