Валидация JSON с JSON Schema и PHP

Источник: «Validating JSON with JSON Schema and PHP»
Простота и гибкость делают JSON идеальным выбором для обмена данными, API и веб-сервисов, конфигурационных файлов, хранения данных и сериализации. Однако такая гибкость может привести к проблемам, если структура данных не будет должным образом проверена. Именно здесь на помощь приходит JSON Schema предоставляющая мощный способ проверки структуры и содержимого данных JSON.

Что такое JSON Schema

JSON Schema — словарь, позволяющий аннотировать и проверять JSON документы. JSON Schema представляет собой договор о том, как должен выглядеть JSON документ, определяя ожидаемую структуру, типы и ограничения данных. Это гарантирует, что данные, передаваемые между системами, соответствуют определённому формату, что снижает вероятность ошибок и улучшает качество данных.

Зачем проверять JSON с JSON Schema

  1. Обеспечение целостности данных: JSON Schema гарантирует, что полученные данные JSON синтаксически корректны и соответствуют заданной структуре. Это очень важно для поддержания целостности данных и предотвращения ошибок, связанных с неожиданными форматами данных.
  2. Чёткая документация: JSON Schema служит чёткой и точной документацией по ожидаемой структуре JSON, облегчая разработчикам понимание и работу с данными.
  3. Улучшенная отладка: Валидация JSON на соответствие схеме позволяет выявлять ошибки на ранних этапах разработки, что делает отладку более простой и эффективной.
  4. Повышение безопасности: Валидация данных 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, можно обеспечить строгие правила валидации, выявляя ошибки на ранней стадии и гарантируя безопасность приложений.

Дополнительные материалы

Предыдущая Статья

Тонкая настройка текстовых полей

Следующая Статья

7 примеров использования Proxy