Yii2自定义参数验证校验json格式参数

云辰大大_2815

云辰大大_2815

2026-08-20

837人浏览

原创

yii2中验证json需自定义逻辑:1.用json_decode+json_last_error校验合法性;2.进一步检查内部结构如字段类型;3.区分表单与api场景处理raw body;4.可封装为复用的jsonvalidator类。

yii2自定义参数验证校验json格式参数

在 Yii2 中验证 JSON 格式参数,核心是先确保字段内容是合法 JSON 字符串,再按需校验其内部结构。不能直接用 json 规则(Yii2 本身无内置 json 验证器),需自定义验证逻辑。

1. 自定义验证方法:检查是否为有效 JSON 字符串

在模型中添加一个验证方法,使用 json_decode($value, true) 判断是否解析成功,并排除 null(因空字符串、"null" 等也会返回 null):

注意:需同时检查 json_last_error() === JSON_ERROR_NONE,避免依赖返回值是否为 null(如 "null" 是合法 JSON,但解码后也是 null)。

  • 在模型的 rules() 中引用该方法,例如:
    ['config', 'validateJsonString']
  • 实现方法如下:

public function validateJsonString($attribute, $params)
{
    $value = $this->$attribute;
    if (!is_string($value) || $value === '') {
        $this->addError($attribute, '必须为非空字符串');
        return;
    }

    $decoded = json_decode($value, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        $this->addError($attribute, '不是合法的 JSON 格式');
        return;
    }

    // 可选:进一步拒绝 "null" 字符串(即 JSON 文本就是 "null")
    // if ($decoded === null && $value !== 'null') {
    //     $this->addError($attribute, 'JSON 解析结果不能为 null');
    // }
}

2. 进阶校验:验证 JSON 内容结构(如必需字段、类型)

仅校验“是 JSON”还不够,常需确保它包含特定 key、对应值为指定类型(如 status 是整数、items 是数组等)。可在同一验证方法中扩展,或拆分为独立方法(如 validateJsonStructure):

Miller CSV TSV JSON 数据处理器
Miller CSV TSV JSON 数据处理器

Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。

下载
  • 先通过 json_decode 得到 PHP 数组/对象
  • isset()is_array()is_int() 等判断结构
  • 示例:要求 JSON 必须有 name(字符串)和 count(正整数):

public function validateJsonStructure($attribute, $params)
{
    $value = $this->$attribute;
    $data = json_decode($value, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        return; // 前置校验应已拦截,此处可跳过或只 warn
    }

    if (!isset($data['name']) || !is_string($data['name']) || trim($data['name']) === '') {
        $this->addError($attribute, 'JSON 中缺少有效的 "name" 字段');
    }
    if (!isset($data['count']) || !is_int($data['count']) || $data['count'] addError($attribute, 'JSON 中 "count" 必须是非负整数');
    }
}

3. 配合表单提交与 API 场景的注意事项

前端传 JSON 时常见两种方式,后端处理逻辑略有不同:

  • 作为普通表单字段值(如 <input name="config">{"a":1}):直接走上述验证即可
  • 作为 raw body(如 POST JSON API):需在控制器中手动读取并赋值,例如:
    $rawBody = file_get_contents('php://input');<br>$model->config = $rawBody;

    再调用 $model->validate()
  • 若用 yii\rest\ActiveController,默认会自动解析 JSON body 到 $model->load(),但前提是 Content-Type 为 application/json 且数据结构匹配;否则仍需手动处理

4. 封装成独立验证器(复用性更高)

若多个模型都要校验 JSON,建议封装为自定义验证器类,继承 yii\validators\Validator

  • 创建 common/validators/JsonValidator.php
  • 重写 validateAttribute(),内含同上的解析 + 错误设置逻辑
  • 支持配置选项,如 'strict' => true(拒绝 null/false/0 等 falsy 值)、'structure' => ['name' => 'string']
  • 规则写法变为:['config', JsonValidator::class]

这样既保持模型轻量,又便于统一维护和测试。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

1955

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

2582

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

896

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

2879

7

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

3736

8

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

2023.07.05

2221

4

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

5982

9

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

2023.08.11

772

5

正则表达式空格
正则表达式空格

正则表达式空格可以用“\s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

500

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.4万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.7万人学习