Skip to content

JSON

Utility třída Petrovo\Json\Json pro bezpečné operace s JSON - validace, kódování a dekódování.

Vrací JSON s bezpečnými defaults: bez escapování Unicode znaků, bez escapování slashes, s hbitým hlášením chyb.

Základní použití

use Petrovo\Json\Json;

// Validace
if (Json::is($string)) {
    $data = Json::decode($string);
}

// Kódování
$json = Json::encode(['name' => 'Jan', 'city' => 'Praha']);

// Výstup (s header a exit)
Json::output(['status' => 'ok', 'data' => $data]);

Metody

is(string $string): bool

Ověří, je-li string validní JSON pole.

$string = '{"name":"Jan"}';

if (Json::is($string)) {
    echo "Validní JSON";
}

encode(mixed $value, int $options, int $depth): string

Zakóduje hodnotu na JSON string. Defaults: - JSON_THROW_ON_ERROR - vyhodí výjimku při chybě - JSON_UNESCAPED_UNICODE - ponechá Unicode znaky (ě, č, ř bez \uXXXX) - JSON_UNESCAPED_SLASHES - bez escapování / znaků

$data = ['name' => 'Jan', 'city' => 'Praha'];

// Základní kódování
$json = Json::encode($data);
// {"name":"Jan","city":"Praha"}

// S vlastními volbami
$json = Json::encode($data, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT);

// Na více řádků
$json = Json::encode($data, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

decode(string $json, bool $assoc, int $depth, int $options)

Dekóduje JSON string. Defaults: - $assoc = true - vrací pole (associative array) - $assoc = false - vrací objekt stdClass - JSON_THROW_ON_ERROR - vyhodí výjimku při chybě - JSON_BIGINT_AS_STRING - velká čísla jako stringy (zabráníš overflow)

$json = '{"name":"Jan","id":123456789012345}';

// Jako pole (default)
$data = Json::decode($json);
// Array: ['name' => 'Jan', 'id' => '123456789012345']
echo $data['name'];  // Jan

// Jako objekt
$obj = Json::decode($json, false);
// stdClass: (object)['name' => 'Jan', 'id' => '123456789012345']
echo $obj->name;     // Jan

output(array $array): void

Kóduje pole na JSON, nastaví header a ukončí script.

// V endpointech
$result = ['status' => 'success', 'id' => 42];
Json::output($result);

// Vytvoří response:
// Content-Type: application/json
// {"status":"success","id":42}

### data(string $urlData): array\

Parsuje JSON formát formulářových dat [{name: 'field', value: 'data'}, ...] na associative pole.

$formData = '[{"name":"email","value":"jan@example.com"},{"name":"password","value":"secret"}]';

$parsed = Json::data($formData);
// ['email' => 'jan@example.com', 'password' => 'secret']

Praktické příklady

Data endpoint s JSON výstupem

<?php
// app/DATA/Users/list.php
declare(strict_types=1);

use Petrovo\Json\Json;
use Petrovo\Database\DB;

$users = DB::results("SELECT id, name, email FROM users ORDER BY name");

// Vrátí JSON s JSON_UNESCAPED_UNICODE (čeština bez escapování)
Json::output([
    'status' => 'success',
    'count' => count($users),
    'data' => $users
]);

Práce s objekty vs. pole

$json = '{"user":{"id":1,"name":"Jan","email":"jan@example.com"}}';

// Jako pole - přístup s []
$data = Json::decode($json);
echo $data['user']['name'];  // Jan

// Jako objekt - přístup s ->
$obj = Json::decode($json, false);
echo $obj->user->name;       // Jan

Chyba handling

use Petrovo\Json\Json;
use JsonException;

try {
    $json = '{"incomplete": ';
    $data = Json::decode($json);  // Vyhodí JsonException
} catch (JsonException $e) {
    echo "Chyba: " . $e->getMessage();
}

Defaults Vysvětlení

Flag Výchozí Efekt
JSON_THROW_ON_ERROR Ano Chyby se vyhodí jako JsonException místo ticha
JSON_UNESCAPED_UNICODE Ano Ponechá ě, č, ř bez \uXXXX escapování
JSON_UNESCAPED_SLASHES Ano / zůstane / místo \/
JSON_BIGINT_AS_STRING Ano (decode) Velká čísla jako stringy - zabráníš PHP integer overflow

Poznámky

  • Při encode() se Stringy automaticky escapují (bezpečné pro XSS)
  • Unicode znaky nejsou escapovány - čeština je čitelná v JSON
  • JSON_BIGINT_AS_STRING je důležité pro bezpečné ID deserialization
  • Vždy používej decode(..., true) nebo decode(..., false) explicitně - nevěř defaults ostatních knihoven