作者: BigLoser 访问次数: 221 创建时间: 2022-10-27 02:02:18 更新时间: 2024-05-08 14:32:48
目前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编码的字符串。
版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。
depth
需要解码的最大深度
flags
的位掩码JSON_INVALID_UTF8_IGNORE 。
以上参数与json_decode一致。
如果给定的字符串是有效的json,则返回true,否则返回false。
版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。
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() 获取验证期间的错误。
以下仅是众多有用的讨论中的一小部分,本文仅做意译:
版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。
1.
一些信任的数据来源的JSON往往很小,但也需要一个验证函数来处理一些不规范的JSON。
2.
使用新的函数可以更容易防御含有拒绝服务攻击内容的json,出于安全原因,这是很好的补充。
3.
快速有效的验证json通信格式,并且减少拒绝服务攻击的攻击面。
json_decode会生成ZVAL(数组、对象等),这将占用内存并处理,如果仅仅是为了验证是否是有效的json字符串,不需要这样做。
使用正则表达式,将导致出现不同于json_decode的实现,并且容易出错,难以维护。
如前文提到的,php的json_decode本身就有一个解析器。json_validate将使用该解析器,以保证100%的兼容性。
版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。
在后面会介绍到,众多有影响力的项目都将因此函数收益。
目前,核心中有一个JSON解析器,由json_decode()来完成。不需要为此决议添加新的JSON解析。新的函数将使用他的解析器,但不会生成对象数组等。
原本的方案中,json_validate可能会对一些情况抛出异常(json_decode完全没有这些行为)。后来经过讨论和建议,修改了实现,不再抛出异常。因为这也并不会更有意义。
下一个PHP8.x,(php8.3)
Symfony Framework
class JsonValidator extends ConstraintValidator
Laravel Framework
版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。
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;
}
在PHP中,这个问题是stackoverflow中与json && php相关的排名最高的问题之一, “在PHP中检查字符串是否为JSON的最快方法?”
查看484k次。 排名
询问如何做到这一点的人,还提供在python和java的真实用例。
这仍然是一个很小的改动,最终以18票同意,1票反对通过了决议。预计将在PHP8.3中实现。
小编锐评:这个功能还是很实用的,比如说当php代码的json字段中存在二进制数据的时候,会报错。对于一些没有经验的开发人员来说,在这个问题上会很郁闷。
有了json验证函数,就可以提前避免类似的问题发生。
语言: zh-CN
翻译人员:
原作者:
转载地址:
源网址: https://phpreturn.com/index/a6358f5a2abccf.html
版权: 本站所有内容, 版权归原作者所有。发表原创内容将会获得现金奖励, 并且随着时间倍数增长, 请了解我们的内容奖励计划。