这项决议在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武器库)所有,本站许可任何形式的转载/引用文章,但必须同时注明出处。