PHP 8.3 的第一个决议:内置 JSON 验证函数
目前PHP8.2已经进入RC阶段,按计划还有一个月就会发布正式版。而PHP8.3的决议也早已开始推进了。
本文为大家介绍一个最新通过的决议,也是PHP8.3的第一个决议:内置JSON验证函数。
这项决议在2022-08-14发起,2022-10-07 投票完成,最终18票通过,1票反对。
本决议很简单,增加一个内置的验证JSON有效的函数:json_validate
。大多数的用户通过json_decode来将json字符串解析为数组或对象,本提议的函数将和json_decode使用完全的相同的JSON解析器,以保证json_validate和json_decode的效果和行为完全一致的。
提议
简介
增加一个函数,定义如下:
json_validate(string $json, int $depth = 512, int $flags = 0): bool
参数
json
需要验证的 json 字符串。
此函数仅适用于 UTF-8 编码的字符串。
depth
需要解码的最大深度
flags
的位掩码 JSON_INVALID_UTF8_IGNORE 。
以上参数与json_decode一致。
返回值
如果给定的字符串是有效的json,则返回true,否则返回false。
例子
1. 验证一个有效的json字符串
var_dump(json_validate('{ "test": { "foo": "bar" } }'));
结果将是
bool(true)
2. 验证一个无效的 json字符串
var_dump(json_validate('{ "": "": "" } }'));
结果将是
bool(false)
可以使用 json_last_error() 和/或 json_last_error_msg() 获取验证期间的错误。
决议的简要
- 各个用户都测试了该功能,并且结果表现正常。对该功能也积极认可。
- 邮件工作组的大多数社区对认可该决议,也期待将其集成到PHP中。
- 负责代码检查的人一致认为,这是小实现,易于维护,同时这样的小实现将带来很大的好处。
- 社区非常积极的参与决议的讨论并提供了各种有效的反馈,并且还花时间测试了该函数。
社区的一些讨论
以下仅是众多有用的讨论中的一小部分,本文仅做意译:
1.
一些信任的数据来源的JSON往往很小,但也需要一个验证函数来处理一些不规范的JSON。
2.
使用新的函数可以更容易防御含有拒绝服务攻击内容的 json,出于安全原因,这是很好的补充。
3.
快速有效的验证json通信格式,并且减少拒绝服务攻击的攻击面。
为什么要集成
使用json_decode做验证的缺点
json_decode会生成ZVAL(数组、对象等),这将占用内存并处理,如果仅仅是为了验证是否是有效的json字符串,不需要这样做。
使用正则表达式的缺点
使用正则表达式,将导致出现不同于json_decode的实现,并且容易出错,难以维护。
用户自行实现的缺点
- 编写json解析器不是一件容易的事
- 它们需要与json_decode的JSON解析器保持同步,否则两者表现可能不一致。
- 用户自己编写一个json解析器是多余的,php本来就有一个。
PHP本来就有一个JSON解析器
如前文提到的,php的json_decode本身就有一个解析器。json_validate将使用该解析器,以保证100%的兼容性。
有影响力的项目和开发者
在后面会介绍到,众多有影响力的项目都将因此函数收益。
核心中增加的复杂性
目前,核心中有一个 JSON 解析器,由 json_decode() 来完成。不需要为此决议添加新的JSON解析。新的函数将使用他的解析器,但不会生成对象数组等。
为什么之前没有
- 集成一个可以用户自行实现的小型实现不是一个好主意。
- json_validate可能仅对边缘情况适用。json_decode可以解决99%的情况。如果为了1%的情况集成,那么要不要增加xml、yaml甚至更多类型的验证函数?这可能会让PHP变得臃肿。
决议期间的变动
原本的方案中,json_validate可能会对一些情况抛出异常(json_decode完全没有这些行为)。后来经过讨论和建议,修改了实现,不再抛出异常。因为这也并不会更有意义。
建议的版本
下一个PHP8.x,(php8.3)
主要受益的开源项目
Symfony Framework
class JsonValidator extends ConstraintValidator
Laravel Framework
public function validateJson($attribute, $value) { if (is_array($value)) { return false; } if (! is_scalar($value) && ! is_null($value) && ! method_exists($value, '__toString')) { return false; } json_decode($value); return json_last_error() === JSON_ERROR_NONE; }
Laravel Framework
public static function isJson($value) {}
Wordpress CLI
function is_json( $argument, $ignore_scalars = true ) { if ( ! is_string( $argument ) || '' === $argument ) { return false; } if ( $ignore_scalars && ! in_array( $argument[0], [ '{', '[' ], true ) ) { return false; } json_decode( $argument, $assoc = true ); return json_last_error() === JSON_ERROR_NONE; }
在Stackoverflow 中的讨论
在 PHP 中,这个问题是 stackoverflow 中与 json && php 相关的排名最高的问题之一, “在 PHP 中检查字符串是否为 JSON 的最快方法?”
查看 484k 次。 排名
询问如何做到这一点的人,还提供在python和java的真实用例。
结尾
这仍然是一个很小的改动,最终以18票同意,1票反对通过了决议。预计将在PHP8.3中实现。
原文标题:PHP8.3的第一个决议:内置json验证函数
原文地址:https://phpreturn.com/index/a6358f5a2abccf.html
原文平台:PHP武器库
版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
FydeOS v15.1 更新上线,有诸多小彩蛋等着你
FydeOS v15.1 是我们对 FydeOS v15 的一个维护版本。在此次的发布里,值得一提的修改的有: 修复了导致「日历小工具」文字翻译显示不正确的问题 (上图属于彩蛋性质!) 修复了导致系统内一些必要可执行文件(wget 和 zip 之类的)可能丢失的问题 更新了系统内置的媒体播放程序 增加了 FydeOS hardware tuner 命令行应用程序(在 bash shell 内执行 hwtuner 即可启用) 其它系统稳定性和性能的提升和优化
- 下一篇
Ember 4.8 发布,初步支持 TypeScript
Ember 项目近日发布了 Ember.js 和 Ember CLI 的 4.8 版本。 Ember.js 4.8 的变化 Ember.js 4.8 是一个增量的、向后兼容的 Ember 版本,包含 bug 修复、性能改进。 错误修复 Ember.js 4.8 引入了 1 个错误修复: 修复了自 4.3.0 以来调用 RouteInfo.find() 方法执行未定义对象回调的错误 特性 Ember.js 4.8 引入了 1 个特性: 作为 TypeScript Adoption Plan(TypeScript 采用计划)的一部分,带来了对 TypeScript 支持的预览。 Ember CLI 4.8 的变化 错误修复 Ember CLI 4.8 引入了 4 个错误修复: 确保新安装的附加组件在运行 ember install 时可以被发现 确保蓝图的选项对象和项目实例对所有公共 hooks 都是可用的 确保无需退出即可处理重建失败的问题 修正了 npm-run-all 和 Yarn 2+ 一起使用时的 glob 匹配问题 特性 Ember CLI 4.8 引入了2 个特性: 在 ap...
相关文章
文章评论
共有0条评论来说两句吧...