hunomina / json-data-validator
Requires
- php: 7.4
- ext-json: *
Requires (Dev)
- phpunit/phpunit: >7 <9
README
描述: 基于数据模式进行json数据验证的库
该库主要由3个接口和3个实现它们的类组成。
该项目采用MIT许可证。
接口和类
DataType
允许将数据封装到对象中,并为DataSchema验证进行格式化。
JsonData
JsonData::format()使用json_decode()将json字符串格式化为php数组。
Rule
允许通过检查数据是否为null、可选以及其长度、模式和数据类型来验证数据单元。
JsonRule
JsonRule可以验证
| 类型/检查 | 长度 | 模式 | 最小/最大值 | 枚举 | 日期格式 | 空值 |
|---|---|---|---|---|---|---|
| 字符串 | ✅ | ✅ | ✅ | ✅ | ✅ | |
| 字符 | ✅ | ✅ | ||||
| 数字 | ✅ (值) | 待办事项 | ||||
| 整数 | ✅ (值) | ✅ | ||||
| 浮点数 | ✅ (值) | ✅ | ||||
| 布尔值 | ||||||
| 字符串列表 | ✅ | ✅ | ✅ (长度) | ✅ | 待办事项 | ✅ |
| 字符列表 | ✅ | ✅ | ✅ (长度) | ✅ | ✅ | |
| 数字列表 | ✅ | ✅ (长度) | ✅ | ✅ | ||
| 整数列表 | ✅ | ✅ (长度) | ✅ | ✅ | ||
| 浮点数列表 | ✅ | ✅ (长度) | ✅ | ✅ | ||
| 布尔值列表 | ✅ | ✅ (长度) | ✅ |
DataSchema
DataSchema是库的主要类。它允许根据"子"模式和Rule验证
DataSchema::validate() 方法允许这种验证。如果 DataType 无法验证 DataSchema,则 DataSchema::validate() 将返回 false,而 DataSchema::getLastError() 将返回验证错误。
JsonSchema
JsonSchema 实现 DataSchema,验证 JsonData 并使用 JsonRule 进行验证。
工作原理
请参阅 测试用例 以获取示例
JsonSchema 有一个类型:object 或 list。
对象由规则和“子”模式组成,如果需要的话。
这是一个模式定义
use hunomina\Validator\Json\Schema\JsonSchema; $schema = new JsonSchema([ 'success' => ['type' => 'bool'], 'error' => ['type' => 'string', 'null' => true], 'user' => ['type' => 'object', 'null' => true, 'optional' => true, 'schema' => [ 'name' => ['type' => 'string'], 'age' => ['type' => 'int'] ]] ]);
模式只是传递给 JsonSchema::setSchema() 方法的 PHP 数组。
这个模式由 3 个元素组成
-
一个
success规则- 是一个布尔值
- 不能为空
- 不是可选的
-
一个
error规则- 是一个字符串
- 可以为空
- 不是可选的
-
一个“子”模式
user- 是一个对象,因此由一个包含 2 个元素的方案表示:一个
name(字符串)和一个age(整数) - 可以为空
- 是可选的
- 是一个对象,因此由一个包含 2 个元素的方案表示:一个
当使用此模式通过调用 JsonSchema::validate() 方法验证数据单元时,模式将递归地检查数据是否遵守规则和“子”模式。
如果数据有
- 一个布尔元素
success - 一个空或字符串元素
error - 一个可选的,空或对象元素
user,它必须有一个- 一个字符串元素
name - 一个整数元素
age
- 一个字符串元素
这个数据是有效的
use hunomina\Validator\Json\Data\JsonData; $data = new JsonData([ 'success' => true, 'error' => null, 'user' => [ 'name' => 'test', 'age' => 10 ] ]);
这个不是
use hunomina\Validator\Json\Data\JsonData; $data = new JsonData([ 'success' => true, 'error' => null, 'user' => 'test' ]);
如前所述,规则可以用来验证长度或数据模式。
此模式在 name 元素上使用模式验证,在 geolocation 元素上使用长度验证
use hunomina\Validator\Json\Schema\JsonSchema; $schema = new JsonSchema([ 'name' => ['type' => 'string', 'pattern' => '/^[a-z]+$/'], 'geolocation' => ['type' => 'integer-list', 'length' => 2] ]);
在调用 JsonSchema::validate() 方法时,模式将递归地检查所有规则集和“子”模式。如果一个规则或一个“子”模式无效,则 JsonSchema::validate() 返回 false。
“第一级”模式是一个 object 类型的模式。它可以更改,但不打算更改。
最后,如果一个“子”模式被标记为 object 类型,则模式将按上述方式验证它。如果它被标记为 list 类型,则模式将简单地使用给定的“子”方案检查数据中的每个元素作为 object 类型。