Валидация JSON с JSON Schema и PHP
Что такое JSON Schema
JSON Schema — словарь, позволяющий аннотировать и проверять JSON документы. JSON Schema представляет собой договор о том, как должен выглядеть JSON документ, определяя ожидаемую структуру, типы и ограничения данных. Это гарантирует, что данные, передаваемые между системами, соответствуют определённому формату, что снижает вероятность ошибок и улучшает качество данных.
Зачем проверять JSON с JSON Schema
- Обеспечение целостности данных: JSON Schema гарантирует, что полученные данные JSON синтаксически корректны и соответствуют заданной структуре. Это очень важно для поддержания целостности данных и предотвращения ошибок, связанных с неожиданными форматами данных.
- Чёткая документация: JSON Schema служит чёткой и точной документацией по ожидаемой структуре JSON, облегчая разработчикам понимание и работу с данными.
- Улучшенная отладка: Валидация JSON на соответствие схеме позволяет выявлять ошибки на ранних этапах разработки, что делает отладку более простой и эффективной.
- Повышение безопасности: Валидация данных JSON помогает предотвратить распространённые проблемы безопасности, такие как атаки инъекций, гарантируя соответствие данных ожидаемому формату.
Валидация синтаксиса JSON в PHP
PHP обеспечивает встроенную поддержку валидации JSON с помощью функции json_validate()
, появившейся в PHP 8.3.
Валидация JSON с помощью json_validate()
Давайте проверим строку JSON с помощью PHP метода json_validate()
для проверки синтаксических ошибок:
$fruitsArray = [
[
'name' => 'Avocado',
'fruit' => '🥑',
'wikipedia' => 'https://en.wikipedia.org/wiki/Avocado',
'color' => 'green',
'rating' => 8,
],
[
'name' => 'Apple',
'fruit' => '🍎',
'wikipedia' => 'https://en.wikipedia.org/wiki/Apple',
'color' => 'red',
'rating' => 7,
],
[
'name' => 'Banana',
'fruit' => '🍌',
'wikipedia' => 'https://en.wikipedia.org/wiki/Banana',
'color' => 'yellow',
'rating' => 8.5,
],
[
'name' => 'Cherry',
'fruit' => '🍒',
'wikipedia' => 'https://en.wikipedia.org/wiki/Cherry',
'color' => 'red',
'rating' => 9,
],
];
if (json_validate($jsonString)) {
echo "Valid JSON syntax.";
} else {
echo "Invalid JSON syntax.";
}
Использование функции json_validate()
в старых версиях PHP
Проект Symfony Polyfill переносит функции из последних версий PHP в старые версии и предлагает уровни совместимости для различных расширений и функций. Он разработан для обеспечения переносимости различных версий PHP и расширений. В частности, Polyfill PHP 8.3 Component переносит функцию json_validate()
на версии PHP до PHP 8.3.
Для установки пакет выполните команду:
composer require symfony/polyfill-php83
Валидация JSON schema в PHP
Валидация синтаксиса JSON vs. валидация JSON Schema
Хотя этот код проверяет, является ли строка JSON синтаксически правильной, он не гарантирует, что данные JSON соответствуют желаемой структуре.
Однако json_validate()
проверяет только синтаксическую правильность строки JSON. Она не проверяет структуру или содержимое данных JSON. Для комплексной проверки можно использовать пакет swaggest/json-schema, проверяющий соответствие данных JSON указанной схеме.
Давайте рассмотрим простой пример, демонстрирующий разницу между json_validate()
и валидацию с JSON Schema используя пакет swaggest/json-schema
.
Шаг 1: Установка пакета swaggest/json-schema
Сначала вам необходимо установить пакет swaggest/json-schema
через Composer:
composer require swaggest/json-schema
Шаг 2: Определение JSON Schema
В примере создадим схему JSON, определяющую ожидаемую структуру данных. Определим схему для простого объекта пользователя, в данном случае в виде PHP строки:
$schemaJson = <<<'JSON'
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "array",
"items" : {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"fruit": {
"type": "string"
},
"wikipedia": {
"type": "string"
},
"color": {
"type": "string"
},
"rating": {
"type": "number"
}
}
}
}
JSON;
Шаг 3: Валидация JSON с JSON Schema
Для проверки структуры JSON данных используем пакет swaggest/json-schema
require 'vendor/autoload.php';
use Swaggest\JsonSchema\Schema;
try {
$schemaObject = Schema::import(
json_decode($schemaJson),
)->in(
json_decode($jsonString),
);
echo "JSON is valid according to the schema.";
} catch (\Swaggest\JsonSchema\Exception\ValidationException $e) {
echo "JSON validation error: " . $e->getMessage();
} catch (\Swaggest\JsonSchema\Exception\TypeException $e1) {
echo "JSON validation Type error: " . $e1->getMessage();
}
В этом примере JSON данные проверяются на соответствие заданной схеме. Если данные не соответствуют схеме, отображается сообщение об ошибке.
Заключение
Валидация JSON данных важна для обеспечения надёжности и безопасности приложений. Хотя встроенная в PHP функция json_validate()
помогает проверить синтаксис JSON, она не обеспечивает всесторонней проверки для обеспечения целостности структуры данных. Используя JSON Schema и пакет swaggest/json-schema
, можно обеспечить строгие правила валидации, выявляя ошибки на ранней стадии и гарантируя безопасность приложений.