PHP 7.3:深入了解 JSON 错误处理
发布于 作者: Paul Redmond
PHP 7.3 中的一项新功能是针对 json_encode()
和 json_decode()
更好的错误处理。该 RFC 以 23 票赞成,0 票反对的结果获得一致通过。让我们来看看在 <= PHP 7.2 中如何处理 JSON 错误,以及 PHP 7.3 中的改进。
背景
在当前的稳定版本 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"
例如,在 Laravel Illuminate\Encryption\Encrypter
类中,这里有一个检查,以确保调用 json_encode()
不会导致错误
// 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 编码/解码是否发生了错误,但这与抛出异常相比有点笨拙,异常会将错误代码和消息整齐地打包在一起。
尽管您必须选择加入,但 v7.3 提供了一种出色的方法,让您能够捕获和处理 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 codejson_last_error(); // Human-friendly messagejson_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()}
有关更多 API 详细信息,请参阅 基本 Exception 类,JsonException
异常是 Exception
的子类。
PHP 7.3 中 JSON 的默认行为
升级到 PHP 7.3 时,您的代码将从第一天起就向后兼容,并继续按预期工作。
PHP 的默认 json_encode|decode()
行为没有改变,抛出错误 RFC 添加了一个新的选项和异常类。
了解更多
您可以在我们宣布 PHP 7.3 Alpha 1 版本 的文章中了解有关 PHP 7.3 中最突出的功能的所有信息。此外,请阅读 JSON_THROW_ON_ERROR 的 RFC,以获取有关即将发布的 PHP 7.3 的提案的完整详细信息。