首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3分钟短文 | PHP咋判断字符串是标准JSON?这样写很高效

3分钟短文 | PHP咋判断字符串是标准JSON?这样写很高效

作者头像
程序员小助手
发布2020-07-16 10:40:41
1.1K0
发布2020-07-16 10:40:41
举报
文章被收录于专栏:程序员小助手程序员小助手

引言

在MYSQL 5.6及以下没有 JSON 这个字段类型的时候,我们还只能用字符串存储数组,对象,这些结构数据;甚至有直接将序列化的对象存库的,都是无奈之举。

编程中也时不时对接口进行json_encode / json_decode。那么如果所得的字符串不是标准的格式,有什么办法快速检测吗?

本文就来说一说。

学习时间

最快的办法,还是使用PHP内置的 json_decode 函数,对于此函数的参数和返回值,我们需要认真地分析。

该函数接受一个 JSON 编码的字符串并且把它转换为 PHP 变量。函数结构:

mixed json_decode( string $json[, bool $assoc = false[, int $depth = 512[, int $options = 0]]] )

除了第一个字符串类型的$json必填之外,其他都是选填。如果我们定制功能,需要后面的参数也指定。比如,解码的字符串解析为关联数组,那么就指定 $assoc = true。

考虑到兼容性的要求,$json 传入的字符串,必须是 UTF-8 编码格式。

我们试着编写一个助手函数,用于判断字符串是否标准的json格式:

function isJson($string) {
 json_decode($string);
 return (json_last_error() == JSON_ERROR_NONE);
}

这个方法使用了2个函数,和1个常量。其中 json_decode 是对字符串解码暂且不说。json_last_error 函数,如果有返回值,则是 JSON 编码解码时最后发生的错误。

JSON_ERROR_NONE 是无错误,=0。该句判断没有错误则是标准格式,返回 true;否则返回 false。

深入学习

其实上面的代码对于 json 加解码过程中的错误判断还是比较粗糙的。有一位小哥不嫌繁琐,手动拼装了详细的错误处理函数,非常实用。

使用上述函数进行测试:

$json = '[{"user_id":13,"username":"stack"},{"user_id":14,"username":"over"}]';
$output = json_validate($json);
print_r($output);

输出内容如下:

这是正常的情况,json 格式完全正确。我们再测试一个不是规范格式的字符串。

$json = '{background-color:yellow;color:#000;padding:10px;width:650px;}';
$output = json_validate($json);
print_r($output);

输出错误信息:

Syntax error, malformed JSON.

万能的正则

跟字符串打交道,正则表达式几乎可以做一切你想要的结果。json 字符串也一样,据文档所说,使用正则表达式判断JSON格式,稳定有效,而且速度还很快。

下面这个正则表达式您拿小本本记好了,一模一样地抄下来用就可以了。

return !preg_match('/[^,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]/', preg_replace('/"(\\.|[^"\\\\])*"/', '', $json_string));

写在最后

如果考虑程序的可读性,和可维护性,使用 json_decode 函数的判断无疑更直观,大家也更熟悉。然而正则表达式所体现出的高效也是不容小觑的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小助手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 学习时间
  • 深入学习
  • 万能的正则
  • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档