:-y

5 : KrISS json

Fri 26 May 2023 - 12:00

Je vous ai dit que j'avais exploré la programmation fonctionnelle avec KrISS aaaa : middleware et il y a quelques années j'ai voulu testé cette même approche pour l'utilisation de schémas json https://json-schema.org

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
New comment







 ___  __   __   __   ___ 
  |  /  \ /  \ /  \ |    
  |  \__/ |  | |__| |__  
  |  /  \ |  | |  | |    
\_/  \__/ \__/ |  | |___