Le résultat final est plutôt chouette :
tests suite: nb tests nb files
draft3: 520/520 35/35
draft4: 735/735 38/38
draft6: 995/995 48/48
draft7: 1286/1286 57/57
draft2019-09: 1571/1651 59/68
draft2020-12: 1579/1677 58/68
draft-next: 1623/1724 58/68
C'était il y a quelques temps et j'ai dû faire 2/3 modifications pour valider les mises à jours des tests fournis par https://github.com/json-schema-org/JSON-Schema-Test-Suite pour continuer à valider les premiers drafts comme à l'époque où j'avais codé ça.
S'il n'y a qu'un seul fichier à regarder c'est la validation des URI/IRI à partir de la RFC
https://github.com/tontof/kriss_json/blob/main/schema/core/inc/rfc.php
Les validations proposées par PHP ne fonctionnaient pas pour tous les tests, j'ai donc dû lire un peu les RFC pour arriver à la validation de tous les tests. C'est à faire au moins une fois dans sa vie...
Pour valider un schéma json, il suffit d'inclure le fichier "json.php" et d'appeler la fonction "json_schema"
<?php
include_once(__DIR__ . '/schema/json.php');
$json = 'https://json-schema.org/learn/examples/address.schema.json';
$address = file_get_contents($json);
$data = '
{
"locality":"locality",
"region":"region"
}
';
var_dump(json_schema(json_decode($address), json_decode($data)));
$data = '
{
"locality":"locality",
"region":"region",
"country-name":"country-name"
}
';
var_dump(json_schema(json_decode($address), json_decode($data)));
$data = '
{
"locality":"locality",
"region":"region",
"country-name":"country-name",
"post-office-box":"post-office-box"
}
';
var_dump(json_schema(json_decode($address), json_decode($data)));
$data = '
{
"locality":"locality",
"region":"region",
"country-name":"country-name",
"post-office-box":"post-office-box",
"street-address":"street-address"
}
';
var_dump(json_schema(json_decode($address), json_decode($data)));
?>
Ce qui donne comme attendu :
bool(false)
bool(true)
bool(false)
bool(true)
En pratique, je vous invite à utiliser une approche plus classique https://json-schema.org/implementations.html#validator-php mais KrISS json reste intéressant de par son approche fonctionnelle