hunomina/json-data-validator

该包已被弃用且不再维护。作者建议使用hunomina/data-validator包。

json模式验证库

3.1.0 2020-01-01 20:46 UTC

README

Build Status codecov

描述: 基于数据模式进行json数据验证的库

该库主要由3个接口和3个实现它们的类组成。

该项目采用MIT许可证。

接口和类

DataType

允许将数据封装到对象中,并为DataSchema验证进行格式化。

JsonData

JsonData实现了DataType

JsonData::format()使用json_decode()将json字符串格式化为php数组。

Rule

允许通过检查数据是否为null、可选以及其长度、模式和数据类型来验证数据单元。

JsonRule

JsonRule实现了Rule

JsonRule可以验证

类型/检查 长度 模式 最小/最大值 枚举 日期格式 空值
字符串
字符
数字 ✅ (值) 待办事项
整数 ✅ (值)
浮点数 ✅ (值)
布尔值
字符串列表 ✅ (长度) 待办事项
字符列表 ✅ (长度)
数字列表 ✅ (长度)
整数列表 ✅ (长度)
浮点数列表 ✅ (长度)
布尔值列表 ✅ (长度)

DataSchema

DataSchema是库的主要类。它允许根据"子"模式和Rule验证

DataSchema::validate() 方法允许这种验证。如果 DataType 无法验证 DataSchema,则 DataSchema::validate() 将返回 false,而 DataSchema::getLastError() 将返回验证错误。

JsonSchema

JsonSchema 实现 DataSchema,验证 JsonData 并使用 JsonRule 进行验证。

工作原理

请参阅 测试用例 以获取示例

JsonSchema 有一个类型:objectlist

对象由规则和“子”模式组成,如果需要的话。

这是一个模式定义

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(整数)
    • 可以为空
    • 是可选的

当使用此模式通过调用 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 类型。