nezarfadle / jsonschemavalidator
Json Schema 验证器
1.0
2016-06-21 10:03 UTC
Requires
- php: >= 5.1.0
Requires (Dev)
- phpunit/phpunit: ^5.4
This package is auto-updated.
Last update: 2024-09-21 20:13:29 UTC
README
安装
composer require nezarfadle/jsonschemavalidator
使用方法
确保导入所有需要的类
use Json\Validation\JsonSchemaValidator; use Json\Validation\Validators\ArrayValueValidator; use Json\Validation\Validators\NumericValueValidator; use Json\Validation\Validators\ObjectValidator; use Json\Validation\Validators\StringValueValidator; use Json\Validation\Validators\RequiredStringValueValidator; // Exceptions use Json\Validation\Exceptions\EmptySchemaException; use Json\Validation\Exceptions\InvalidJsonPayloadException; use Json\Validation\Exceptions\EmptyPayloadException; use Json\Validation\Exceptions\NotExistsPropertyException;
1. 简单验证
$json = <<<EOL { "id" : 1 } EOL; $validator = new JsonSchemaValidator(); $schema = [ 'id' => new NumericValueValidator() // validate whether the id is numeric or not ]; try { $validator->validate( $json, $schema ); echo "Valid numeric value"; } catch (EmptySchemaException $e) {} catch (InvalidJsonPayloadException $e) {} catch (EmptyPayloadException $e) {} catch (\InvalidArgumentException $e) {} catch (NotExistsPropertyException $e) {}
2. 嵌套验证
$json = <<<EOL { "data": { "item1":{ "item2":{ "item3":{ "item4":{ "title": "Fake Content" } } } } } } EOL; $validator = new JsonSchemaValidator(); $schema = [ 'data.item1.item2.item3.item4' => new ObjectValidator(), // validate whether item4 is an object 'data.item1.item2.item3.item4.title' => new StringValueValidator() // validate whether item4.title is a string ]; try { $validator->validate( $json, $schema ); echo "Valid nested payload "; } catch (EmptySchemaException $e) {} catch (InvalidJsonPayloadException $e) {} catch (EmptyPayloadException $e) {} catch (\InvalidArgumentException $e) {} catch (NotExistsPropertyException $e) {}
3. 多重验证
$json = <<<EOL { "title" : "PHP is Cool" } EOL; $validator = new JsonSchemaValidator(); $schema = [ 'title' => [ new StringValueValidator(), new RequiredStringValueValidator() ] ]; try { $validator->validate( $json, $schema ); echo "Valid Title"; } catch (EmptySchemaException $e) {} catch (InvalidJsonPayloadException $e) {} catch (EmptyPayloadException $e) {} catch (\InvalidArgumentException $e) {} catch (NotExistsPropertyException $e) {}
4. JsonApi 规范用例
$json = <<<EOL { "data": { "type": "photos", "attributes": { "title": "Ember Hamster", "src": "http://example.com/images/productivity.png" } } } EOL; $validator = new JsonSchemaValidator(); $schema = [ 'data' => new ObjectValidator(), // validate whether the data is an object 'data.attributes' => new ObjectValidator(), // validate whether the attributes is an object 'data.attributes.title' => new StringValueValidator(), // validate whether the title is string 'data.attributes.src' => new StringValueValidator(), // validate whether the src is string ]; try { $validator->validate( $json, $schema ); echo "Valid json api spec payload "; } catch (EmptySchemaException $e) {} catch (InvalidJsonPayloadException $e) {} catch (EmptyPayloadException $e) {} catch (\InvalidArgumentException $e) {} catch (NotExistsPropertyException $e) {}
如何编写自定义断言类
- 你需要实现
php Json\Validation\Interfaces\IJsonValidator
interface IJsonValidator { public function validate( $propertyName, $value ); }
$propertyName: The property name you want to validate $value: The actual value you want to validate
####大于十的验证器
class GreaterThanTenValidator implements Json\Validation\Interfaces\IJsonValidator { public function validate( $propertyName, $value ) { if( !is_numeric( $value ) || $value <= 10 ) { throw new \InvalidArgumentException( $propertyName . ": is less than 10" ); } } } $json = <<<EOL { "id" : 11 } EOL; $validator = new JsonSchemaValidator(); $schema = [ 'id' => new GreaterThanTenValidator() ]; try { $validator->validate( $json, $schema ); echo "Greater than 10"; } catch (EmptySchemaException $e) {} catch (InvalidJsonPayloadException $e) {} catch (EmptyPayloadException $e) {} catch (\InvalidArgumentException $e) {} catch (NotExistsPropertyException $e) {}
#Json Schema 验证器组件
Json 验证器
Json\Validation\JsonSchemaValidator
接口
Json\Validation\Interfaces\IJsonSchemaValidator
断言类(未来将添加更多,或查看如何创建自己的断言类)
Json\Validation\Validators\ArrayValueValidator Json\Validation\Validators\NumericValueValidator Json\Validation\Validators\ObjectValidator Json\Validation\Validators\StringValueValidator Json\Validation\Validators\RequiredStringValueValidator
异常
Json\Validation\Exceptions\EmptySchemaException Json\Validation\Exceptions\InvalidJsonPayloadException Json\Validation\Exceptions\EmptyPayloadException Json\Validation\Exceptions\NotExistsPropertyException
异常执行顺序
####1. EmptySchemaException
如果提供的
$schema = []; $validator->validate( $json, $schema );
####2. InvalidJsonPayloadException
如果提供的 json 有效载荷无效
$json = 'invalid json payload'; $validator->validate( $json, $schema );
####3. EmptyPayloadException
如果提供的 json 有效载荷是空对象
$json = '{}'; $validator->validate( $json, $schema );
####4. InvalidArgumentException
如果验证失败
####5. NotExistsPropertyException
如果提供的属性不存在于 json 有效载荷中
$json = <<<EOL { "title" : "PHP is Cool" } EOL; $validator = new JsonSchemaValidator(); $schema = [ 'id' => new StringValueValidator() ]; $validator->validate( $json, $schema ); // NotExistsPropertyException will be thrown
如何运行测试
phpunit