71 lines
1.9 KiB
PHP
71 lines
1.9 KiB
PHP
<?php
|
|
namespace nur;
|
|
|
|
use Exception;
|
|
use nur\b\io\IOException;
|
|
use nur\b\io\IReader;
|
|
use nur\b\ValueException;
|
|
|
|
/**
|
|
* Class json: gestion de données json
|
|
*/
|
|
class json {
|
|
static function decode(string $json, int $flags=0) {
|
|
return json_decode($json, true, 512, $flags);
|
|
}
|
|
|
|
static function encode($data, int $flags=0): string {
|
|
$flags |= JSON_UNESCAPED_SLASHES + JSON_UNESCAPED_UNICODE;
|
|
return json_encode($data, $flags);
|
|
}
|
|
|
|
static function check(string $json, &$data=null): bool {
|
|
try {
|
|
$data = self::decode($json, JSON_THROW_ON_ERROR);
|
|
return true;
|
|
} catch (Exception $e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @throws ValueException si $input n'est pas un string ni une instance de
|
|
* {@link IReader}
|
|
* @throws IOException si une erreur de lecture s'est produite
|
|
*/
|
|
static final function load($input): array {
|
|
$contents = reader::get_contents($input);
|
|
$data = IOException::ensure_json_value(self::decode($contents));
|
|
return A::with($data);
|
|
}
|
|
|
|
/** obtenir la valeur JSON correspondant au corps de la requête POST */
|
|
static final function post_data() {
|
|
$post_data = file_get_contents("php://input");
|
|
return self::decode($post_data);
|
|
}
|
|
|
|
/** envoyer $data au format JSON */
|
|
static final function send($data, bool $exit=true): void {
|
|
header("Content-Type: application/json");
|
|
print self::encode($data);
|
|
if ($exit) exit;
|
|
}
|
|
|
|
const INDENT_TABS = "\t";
|
|
|
|
static final function with($data, ?string $indent=null): string {
|
|
$json = self::encode($data, JSON_PRETTY_PRINT);
|
|
if ($indent !== null) {
|
|
$json = preg_replace_callback('/^(?: {4})+/m', function (array $ms) use ($indent) {
|
|
return str_repeat($indent, strlen($ms[0]) / 4);
|
|
}, $json);
|
|
}
|
|
return $json;
|
|
}
|
|
|
|
static final function dump($data, $output=null): void {
|
|
writer::with($output)->write(self::with($data))->close();
|
|
}
|
|
}
|