php json error,PHP 7.3 中的 JSON 错误处理

9ddd575cdf95ef9efa556d83d65d360c.png

PHP 7.3 为 json_encode() 和 json_decode() 函数增加的一个新特性使其更好的处理错误。这个特性「 RFC 」以 23 比 0 的投票结果被一致接受。让我们看一看在 PHP 7.2 及一下版本中是如何处理 JSON 错误的,以及 PHP 7.3 中新的改进。

背景

当前在 PHP7.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() 不会导致出错。

// 当我们获取到加密的数值时,我们会先用 base64_encode 处理

// 并且为我们要加密的数值创建用来验证的 MAC 值

// 最后我们会将三者组成的数组 JSON 格式化

$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 异常——接下来让我们看看我们可以使用的新特性( flag 字面来翻就是标志、旗帜这些,但是此处感觉特性比较好,才疏学浅,请指正)。

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() 匹配的标志时,这种风格对的 userland 代码特别有用,这样 JSON 编码和解码可以更加高效的去处理错误

PHP 7.3 中 json_decode 函数增加了一些参数,用来处理错误,比如如下所示:

use JsonException;

try {

return json_decode($jsonString, $assoc = true, $depth = 512, JSON_THROW_ON_ERROR);

} catch (JsonException $e) {

// 处理 JSON 异常

}

// Or even just let it bubble up...

/**

* 将 JSON 字符串解码为数组 (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 的错误代码和错误信息,需要使用以下函数:

// 错误代码

json_last_error();

// 易于理解的错误信息

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()

}

查看更多 API 详细信息,请访问「base Exception 」, JsonException 异常是 Exception 的一个子类。

JSON 在 PHP 7.3 中的默认行为

当升级到 PHP 7.3 时,你将在一天内完成代码的向后兼容,并按照预期的结果继续工作。

PHP 的默认函数 json_encode|decode() 的行为没有改变, 在抛出的错误中 RFC 增加了一个新的选项和异常类。

了解更多

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接

我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#趣味程序---三色球问题

问题:若一个口袋中放有12个球,3红3白和6黑,问从袋中任意取8个球,有多少种不同的颜色搭配? using System;namespace ConsoleApplication1 {class Program{static void Main(string[] args){Console.WriteLine("共有…

剑指offer之C++语言实现链表(两种删除节点方式)

1 问题 用C语言实现链表 2 代码实现 #include <iostream> #include <stdlib.h>using namespace std;class List { public:List();~List();List* createNode(int value);//创建节点bool insertNode(List *node);//插入节点void printList();//打印节点bool delete…

【C语言简单说】十九:二维数组循环嵌套(2)

这节直接用循环嵌套来输出二维数组了&#xff1a; 注&#xff1a;我说的队和列并不是一般说法&#xff0c;我用此比喻好让新手更好理解。 #include<stdio.h> #include<stdlib.h> int main() {int array[2][3]{1,2,3,4,5,6};//第一句 int i,j;//第二句 for(i0;i&l…

C# 11 对 ref 和 struct 的改进

前言C# 11 中即将到来一个可以让重视性能的开发者狂喜的重量级特性&#xff0c;这个特性主要是围绕着一个重要底层性能设施 ref 和 struct 的一系列改进。但是这部分的改进涉及的内容较多&#xff0c;不一定能在 .NET 7&#xff08;C# 11&#xff09;做完&#xff0c;因此部分内…

lia人是什么意思_狗狗喜欢舔人到底什么意思?毛孩的心思主人你要懂

很多人都喜欢养狗&#xff0c;因为它们忠诚、淘气、可爱。同时&#xff0c;狗狗也有很多奇怪的习惯&#xff0c;例如&#xff1a;喜欢舔人&#xff0c;喜欢追逐活动的东西等等。不过大多数狗主人通常都会有一个最想知道的问题&#xff1a;为什么狗狗总喜欢舔人&#xff0c;它们…

UINavigationController

-(void)resetTabbarController:(UITabBarController *)controller { NSArray *arr controller.tabBar.items; UITabBarItem *item0 [arr objectAtIndex:0]; //使用指定图片 [item0 setSelectedImage:[[UIImage imageNamed:"icon_everyday_press"] imageWithRenderi…

“爱思助手”曝为iOS木马:可绕过苹果DRM机制

一款新的iOS木马已在国内曝光&#xff0c;它可以通过PC感染未越狱的iOS设备&#xff0c;而无需利用企业证书。Palo Alto Networks指出&#xff0c;其名叫“爱思助手”(AceDeceiver)&#xff0c;目前正在影响我国的iOS用户。“爱思助手”利用了苹果数字版权管理(DRM)上的FairPla…

php自动生成mysql的触发代码。

php自动生成mysql的触发代码。 如果公司里有上百个表要做触发器&#xff0c;如果手动写代码的话。很累&#xff0c;所以今天写了一个小程序&#xff0c; <?php $dbname test;//数据库 $tab1 user; //执行的表 $tab2 user_bak; //被触发的表 $conn mysql_connect("…

C#趣味程序---求两个数的最大公约数和最小公倍数

using System;namespace ConsoleApplication1 {class Program{static void Main(string[] args){Console.WriteLine("请输入一个数&#xff1a;");int num1 int.Parse(Console.ReadLine());Console.WriteLine("请输入另一个数&#xff1a;");int num2 in…

php运行条件,PHP配置环境要求 php运行的先决条件

类型&#xff1a;编程相关大小&#xff1a;320KB语言&#xff1a;中文 评分&#xff1a;6.6标签&#xff1a;立即下载在本教程中&#xff0c;假设用户的服务器已经安装并运行了 PHP&#xff0c;所有以 .php 结尾的文件都将由 PHP 来处理。在大部分的服务器上&#xff0c;这是 P…

剑指offer之二维数组中查找

1 问题 二维数组中查找&#xff1a; 在一个二维数组钟&#xff0c;每一行都按照从左到右递增得顺序排列&#xff0c;每一列 都按照从上往下得递增排列&#xff0c;请完成一个函数&#xff0c;输入这样得一个二维数组和一个 整数&#xff0c;判断数组是否含有该整数 列如&…

【C语言简单说】二十:指针基础

。。据说指针很难 其实稍微理解概念不难。 先看百科的定义&#xff1a;在计算机科学中&#xff0c;指针&#xff08;Pointer&#xff09;是编程语言中的一个对象&#xff0c;利用地址&#xff0c;它的值直接指向&#xff08;points to&#xff09;存在电脑存储器中另一个地方的…

移动web开发(三)——字体使用

参考&#xff1a; 移动web页面使用字体的思考.http://www.cnblogs.com/PeunZhang/p/3592096.html

c#可变参数params的介绍

c#可变参数params的介绍作为一个netUp主&#xff0c;今天在b站刷到了java的一个视频&#xff0c;可变参数的介绍&#xff0c;所以今天给大家介绍一下c#中可变参数params的使用介绍&#xff0c;我们首先看一下官方解释: 使用 params 关键字可以指定采用数目可变的参数的params。…

Javascript中的循环变量声明,到底应该放在哪儿?

不放走任何一个细节。相信很多Javascript开发者都在声明循环变量时犹 豫过var i到底应该放在哪里&#xff1a;放在不同的位置会对程序的运行产生怎样的影响&#xff1f;哪一种方式符合Javascript的语言规范&#xff1f;哪一种方式和ecma标准未来的发展 方向匹配&#xff1f;本文…

Delphi全局热键的注册

1.在窗启动时创建ATOM;(aatom:ATOM;定义在private中&#xff09; 1 if FindAtom(ZWXhotKey)0 then 2 begin 3 aatom:GlobalAddAtom(ZWXhotKey); 4 end; 5 if RegisterHotKey(Handle,aatom,MOD_ALT,$41) then 6 begin 7 MessageBox(Handle,按alta,提示,MB_OK); 8 end; 2.定义处…

python爬取网易云音乐问题陈述_python 网易云音乐 评论爬取问题

除了使用phantomjs,selenium之外&#xff0c;怎么爬取多页评论&#xff0c;这两个都太慢了。例如http://music.163.com/#/song?i... 的 评论。webapi都是http://music.163.com/weapi/v1...&#xff0c;每页20个评论&#xff0c;怎么获取下一页的评论&#xff0c;param是加密的…

C#趣味程序----分数之和

问题:求这样的四个自然数p,q,r,s(p<=q<=r<=s),使得等式1/p + 1/q +1/r +1/s=1成立。 分析:将原式同分,化简整理后得到:2<=p<5,p<=q<7,q<r<13。 using System;namespace ConsoleApplication1 {class Program{static void Main(string[] ar…

php gearmanclient addoptions,gearman PHP7扩展安装

注&#xff1a;官方提供的只支持PHP 6&#xff0c;需要第3方支持&#xff0c;https://github.com/wcgallego/pecl-gearmanyum install libgearman-devel -y 如没装&#xff0c;则config时报错 error: Please install libgearmanwget https://github.com/wcgallego/pecl-gearm…

剑指offer之把字符串里面空格替换成百分之20

1 问题 把字符串里面空格替换成百分之20 2 代码实现 第一种时间复杂的o(n * n)实现 #include <stdio.h> #include <stdlib.h>char* insert(char *a, int len, char *replace, int replaceLen) {//先得到多少个空格char *p a;int count 0;while (*p ! \0){if (…