一次有趣的 php json_decode error 分析
之前同事问了我一个有趣的问题,说为什么这个 json 字符串从缓存里读出来可以解析,但是作为一个 php 变量却解析错误呢?
先看一个我已经简化了的例子
$str = "\\"; $j = json_encode($str); echo $j, PHP_EOL; echo json_decode($j), PHP_EOL;
输出
"\\" \
如果你直接把输出的 json 字符串赋值给一个 php 字符串变量的话,好玩的事情就发生了
$conf = <<<EOD "\\" EOD; // heredoc // $conf = '"\\"'; // 单引号 // $conf = "\"\\\""; // 双引号 var_dump(json_decode($conf, true)); echo json_last_error_msg(), PHP_EOL;
输出
NULL Control character error, possibly incorrectly encoded
你就会发现,不管怎么搞,json_decode 总是失败的,然后我慢慢的把 json 字符串抽茧剥丝,最后只剩下“\\”,发现问题出在这里。
乍一看,这个字符串并没有什么特别之处,但是在我把它 echo 之后,终于搞明白到底为什么一直 json_decode 失败了
$conf = <<<EOD "\\" EOD; echo $conf,PHP_EOL;
输出
\
“\\” 这货被转义了,然后这就不再是一个正常的 json 字符串了,所以 json_decode 就会失败,那么才能让它正确的被 decode 呢?看下面这段代码
$conf = <<<'EOD' "\\" EOD; // nowdoc var_dump(json_decode($conf, true)); echo json_last_error_msg(), PHP_EOL;
输出
string(1) "\" No error
我们使用 nowdoc (http://php.net/manual/zh/language.types.string.php#language.types.string.syntax.nowdoc),这样就不会被转义了。
就象 heredoc 结构类似于双引号字符串,Nowdoc 结构是类似于单引号字符串的。Nowdoc 结构很象 heredoc 结构,但是 nowdoc 中不进行解析操作。这种结构很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义。
更多架构、PHP、GO相关踩坑实践技巧请关注我的公众号:PHP架构师
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
关于Greenplum的那点事儿
Greenplum是什么鬼?干啥用的?能吃吗? 下面是来自官网的一段英文: 大概翻译一下: Greenplum Database是一个大规模并行处理(MPP)数据库服务器,其架构专门用于管理大规模分析数据仓库和商业智能工作负载。 MPP(也称为无共享架构)是指具有两个或更多处理器的系统,它们协作执行操作,每个处理器具有其自己的存储器,操作系统和磁盘。Greenplum使用这种高性能系统架构来分配多TB数据仓库的负载,并且可以并行使用所有系统资源来处理查询。 Greenplum数据库基于PostgreSQL开源技术。它本质上是几个PostgreSQL面向磁盘的数据库实例,它们共同作为一个有凝聚力的数据库管理系统(DBMS)。它基于PostgreSQL 8.3.23,在大多数情况下与PostgreSQL在SQL支持,功能,配置选项和最终用户功能方面非常相似。数据库用户与Greenplum数据库交互,就像使用常规PostgreSQL DBMS一样。 Greenplum采用Postgresl作为底层引擎,良好的兼容了Postgresql的功能,Postgresql中的功能模块和接口基本上...
- 下一篇
beeshell:开源的 React Native 组件库
介绍 beeshell 是一个 React Native 应用的基础组件库,基于 0.53.3 版本,提供一整套开箱即用的高质量组件,包含 JavaScript(以下简称 JS)组件和复合组件(包含 Native 代码),涉及前端(FE)、iOS、Android 三端技术,兼顾通用性和定制化,支持自定义主题,用于开发和服务企业级移动应用。现在已经在 GitHub 上开源,地址:https://github.com/meituan/beeshell 截止目前,beeshell 中的组件已经在美团外卖移动端应用蜜蜂 App 中广泛应用,而且已经持续了一年多时间,通过了各种业务场景、操作系统、机型的实战考验,具备很好的稳定性、安全性和易用性,所以我们将其开源,以期发挥出更大的应用价值。 特性 UI 样式的一致性和定制化。 通用性。主要使用 JS 来实现,保证跨平台通用性。 定制化。我们在比较细的粒度上对组件进行拆分,通过继承的方式层层依赖,功能渐进式增强,为在任意层级上的继承扩展、个性化定制提供了可能。 原生功能支持。组件库中的复合组件包含 Native 代码,支持图片选择、定位等原生功能。...
相关文章
文章评论
共有0条评论来说两句吧...