PHP Manual
/
Dátové štruktúry

Json v PHP - spracovanie, generovanie a formátovanie

26. 11. 2019

Obsah článku

Dátový formát Json bol vytvorený na uľahčenie prenosu štruktúrovaných údajov medzi klientom a serverom.

Konverzia poľa alebo objektu na json

Na konverziu poľa alebo objektu do Json je v PHP k dispozícii funkcia json_encode:

$user = [
'name' => "John,
'priezvisko' => "Barasek,
'role' => [
'admin',
'moderátor',
],
];
echo json_encode($user);

Vytvorí:

{"name":"Jan","surname":"Barasek","role":["admin","moderator"]}

Funkcia json_encode() dokáže konvertovať aj iné dátové typy. Môžeme napríklad priamo vložiť integer (celé číslo), string (reťazec) atď.

Json pretty print - lepšia čitateľnosť pre človeka

V predvolenej konfigurácii sa json generuje ako jeden dlhý reťazec. Je to z dôvodu, aby zaberali čo najmenej miesta.

Ak požadujete lepšiu čitateľnosť, stačí ako druhý parameter odovzdať konštantu JSON_PRETTY_PRINT:

echo json_encode($users, JSON_PRETTY_PRINT);

Vytvorí:

{
"meno": "John.",
"priezvisko": "Barasek",
"role": [
"admin",
"moderátor"
]
}

Formátovanie json - vlastné pravidlá formátovania

Bežné formátovanie json prostredníctvom PHP nemá žiadne ďalšie nastavenia a musíme sa uspokojiť len s týmto výstupom. Ak napríklad chceme namiesto medzier odsadiť tabulátory (alebo akokoľvek upraviť pravidlá generovania), musíme si to naprogramovať sami.

Táto funkcia už dokáže vykonávať základné formátovanie a my ju musíme len upraviť:

function prettyJsonPrint(string $json): string
{
$result = '';
$level = 0;
$in_quotes = false;
$in_escape = false;
$ends_line_level = NULL;
$json_length = strlen($json);
for ($i = 0; $i < $json_length; $i++) {
$char = $json[$i];
$new_line_level = NULL;
$post = '';
if ($ends_line_level !== NULL) {
$new_line_level = $ends_line_level;
$ends_line_level = NULL;
}
if ($in_escape) {
$in_escape = false;
} else if ($char === '"') {
$in_quotes = !$in_quotes;
} else if (!$in_quotes) {
switch ($char) {
case '}':
case ']':
$level--;
$ends_line_level = NULL;
$new_line_level = $level;
break;
case '{':
case '[':
$level++;
case ',':
$ends_line_level = $level;
break;
case ':':
$post = ' ';
break;
case " ":
case "\t":
case "\n":
case "\r":
$char = '';
$ends_line_level = $new_line_level;
$new_line_level = NULL;
break;
}
} else if ($char === '\\') {
$in_escape = true;
}
if ($new_line_level !== NULL) {
$result .= "\n" . str_repeat("\t", $new_line_level);
}
$result .= $char . $post;
}
return $result;
}

Zdroj: https://stackoverflow.com/questions/6054033/pretty…

Zadajte napríklad:

{"key1":[1,2,3],"key2":"hodnota"}

Formátované ako:

{
"key1": [
1,
2,
3
],
"key2": "hodnota"
}

Čo je oveľa ľahšie čitateľné (vďaka dôslednému odsadeniu jednotlivých prvkov).

Zafarbenie zápisu json ako HTML

Niekedy môže byť užitočné farebne zvýrazniť kľúče, samotné údaje a jednotlivé formátovacie prvky (najmä uzatváracie zátvorky).

Zadajte napríklad:

{"prístup": {"token": {"issued_at": "2008-08-16T14:10:31.309353", "vyprší": "2008-08-17T14:10:31Z", "id": "MIICQgYJKoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"}, "serviceCatalog": [], "user": {"užívateľské meno": "ajay", "roles_links": [], "id": "16452ca89", "roly": [], "meno": "ajay"}}}

Formátované ako:

{
  "prístup": {
   "token": {
      "issued_at""2008-08-16T14:10:31.309353"
     "expires""2008-08-17T14:10:31Z"
     "id""MIICQgYJKoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"
    },
   "serviceCatalog": [
   ],  
   "user": {
     "užívateľské meno""ajay"
    "roles_links": [
     ],  
     "16452ca89"
    "roly": [
     ],  
     "meno""ajay"
    }
  }
}

To možno realizovať pomocou nasledujúcej funkcie:

function jsonColorFormater(string $json, string $indentation = "\t"): string
{
$crl = 0;
$ss = false;
$buffer = '';
for ($c = 0; $c < strlen($json); $c++) {
if ($json[$c] == '}' || $json[$c] == ']') {
$crl--;
$buffer .= "\n" . str_repeat($indentation, $crl);
}
if ($json[$c] == '"' && (@$json[$c - 1] == ',' || @$json[$c - 2] == ',')) {
$buffer .= "\n" . str_repeat($indentation, $crl);
}
if ($json[$c] == '"' && !$ss) {
$buffer .= '<span style='color:'.((@$json[$c - 1] == ':' || @$json[$c - 2] == ':') ? '#35D' : '#C22').';">';
}
$buffer .= $json[$c];
if ($json[$c] == '"' && $ss) $buffer .= '</span>';
if ($json[$c] == '"') $ss = !$ss;
if ($json[$c] == '{' || $json[$c] == '[') {
$crl++;
$buffer .= "\n". str_repeat($indentation, $crl);
}
}
// Vracia zdroj HTML
return '<pre>' . $buffer . '</pre>';
}
// Stačí zavolať túto funkciu a vrátiť formátovaný výstup
// echo jsonColorFormater($data, ' ');

Funkcia prevzatá a radikálne prepracovaná z: https://stackoverflow.com/a/20953262/6777550

Prevod z JSON na pole/objekt PHP

To možno realizovať pomocou funkcie json_decode(), ktorá z Json vytvorí dátovú štruktúru, s ktorou musíme pracovať ako s objektom:

$json = '{"name": "Jan", "surname": "Barasek", "role":["admin", "moderator"]}';
$decode = json_decode($json);
echo $decode->name; // Vracia 'Jan'
// echo $decode->role;
//
// Toto nie je možné, pretože rola vlastnosti
// obsahuje pole, ktoré musíme iterovať.
echo '<ul>';
foreach ($decode->role as $role) {
echo '<li>' . $role . '</li>'; // Postupne uvádza roly za odrážkami
}
echo '</ul>';

Spracovanie v jazyku javascript

Napríklad v knižnici jQuery možno reťazec json veľmi jednoducho analyzovať na objekt:

var json = '{"name": "Jan", "surname": "Barasek", "role":["admin", "moderator"]}';
var parser = $.parseJSON(json);
document.write('Názov: ' + parser.name);
console.log(parser); // Vypíše celý objekt na konzolu na ladenie

V javascripte je vo všeobecnosti každý json platným javascriptovým objektom, s ktorým možno priamo pracovať a pristupovať k jeho vlastnostiam.

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
Status:
All systems normal.
2024