背景
在目前穩定的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() }