Json, zpracování, generování a formátování v PHP

Pro snadný přenos strukturovaných dat mezi klientem a serverem vznikl datový formát Json.

Převod z PHP pole / objektu do JSON

V PHP ho z pole vygenerujeme relativně snadno:

 1 $users = [
 2     'name' => 'Jan',
 3     'surname' => 'Barasek',
 4     'role' => [
 5         'admin',
 6         'moderator',
 7     ],
 8 ];
 9 
10 echo json_encode($users);

Vygeneruje:

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

Formátování Jsonu | Vylepšení čitelnosti

Což ovšem nemusí být vždy dobře čitelné pro člověka, proto můžeme výstup vylepšit druhým parametrem:

1 echo json_encode($users, JSON_PRETTY_PRINT);

Vygeneruje:

1 {
2     "name": "Jan",
3     "surname": "Barasek",
4     "role": [
5         "admin",
6         "moderator"
7     ]
8 }

Formátování Jsonu | Vlastní formátovací pravidla

Běžné formátování Jsonu přes PHP nemá žádné další nastavení a musíme se spokojit pouze s tímto výstupem. Pokud chceme například místo mezer odsazovat tabulátory (nebo jakkoli pozměnit pravidla generování), musíme si to naprogramovat sami.

Tato funkce umí již základní formátování a stačí ji jen pozměnit:

 1 function prettyJsonPrint($json) {
 2     $result = '';
 3     $level = 0;
 4     $in_quotes = false;
 5     $in_escape = false;
 6     $ends_line_level = NULL;
 7     $json_length = strlen($json);
 8 
 9     for ($i = 0; $i < $json_length; $i++) {
10         $char = $json[$i];
11         $new_line_level = NULL;
12         $post = '';
13         if ($ends_line_level !== NULL) {
14             $new_line_level = $ends_line_level;
15             $ends_line_level = NULL;
16         }
17         if ($in_escape) {
18             $in_escape = false;
19         } else if ($char === '"') {
20             $in_quotes = !$in_quotes;
21         } else if (!$in_quotes) {
22             switch ($char) {
23                 case '}':
24                 case ']':
25                     $level--;
26                     $ends_line_level = NULL;
27                     $new_line_level = $level;
28                     break;
29 
30                 case '{':
31                 case '[':
32                     $level++;
33                 case ',':
34                     $ends_line_level = $level;
35                     break;
36 
37                 case ':':
38                     $post = ' ';
39                     break;
40 
41                 case " ":
42                 case "\t":
43                 case "\n":
44                 case "\r":
45                     $char = '';
46                     $ends_line_level = $new_line_level;
47                     $new_line_level = NULL;
48                     break;
49             }
50         } else if ($char === '\\') {
51             $in_escape = true;
52         }
53         if ($new_line_level !== NULL) {
54             $result .= "\n" . str_repeat("\t", $new_line_level);
55         }
56         $result .= $char . $post;
57     }
58 
59     return $result;
60 }

Funkce převzata z: http://stackoverflow.com/…6726/6777550

Například vstup:

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

Naformátuje jako:

1 {
2     "key1": [
3         1,
4         2,
5         3
6     ],
7     "key2": "value"
8 }

Což je mnohem lépe čitelné (kvůli důslednému odsazení každého prvku).

Formátování Jsonu | Vlastní obarvení výstupu

Někdy se může hodit barevné zvýraznění klíčů, samotných dat a také jednotlivých formátovacích prvků (zejména uzavírací závorky).

Například vstup:

1 {"access": {"token": {"issued_at": "2008-08-16T14:10:31.309353", "expires": "2008-08-17T14:10:31Z", "id": "MIICQgYJKoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"}, "serviceCatalog": [], "user": {"username": "ajay", "roles_links": [], "id": "16452ca89", "roles": [], "name": "ajay"}}}

Naformátuje jako:

{

  „access“: {

    „token“: {

      „issued_at“„2008–08–16T14:10:31.309353“

      „expires“„2008–08–17T14:10:31Z“

      „id“„­MIICQgYJKoZIh­vcIegeyJpc3N1ZWRfYX­QiOiAi“

    }, 

    „serviceCa­talog“: [

    ], 

    „user“: {

      „userna­me“„ajay“

      „roles_lin­ks“: [

      ], 

      „id“„­16452ca89“

      „roles“: [

      ], 

      „name“„a­jay“

    }

  }

}

To lze implementovat následující funkcí:

 1 function jsonColorFormater($json, $indentation = "\t") {
 2     $crl = 0;
 3     $ss = false;
 4     $buffer = '';
 5     for ($c = 0; $c < strlen($json); $c++) {
 6         if ($json[$c] == '}' || $json[$c] == ']') {
 7             $crl--;
 8             $buffer .= "\n" . str_repeat($indentation, $crl);
 9         }
10         if ($json[$c] == '"' && (@$json[$c - 1] == ',' || @$json[$c - 2] == ',')) {
11             $buffer .= "\n" . str_repeat($indentation, $crl);
12         }
13         if ($json[$c] == '"' && !$ss) {
14             $buffer .= '<span style="color:'.((@$json[$c - 1] == ':' || @$json[$c - 2] == ':') ? '#35D' : '#C22').';">';
15         }
16         $buffer .= $json[$c];
17         if ($json[$c] == '"' && $ss) $buffer .= '</span>';
18         if ($json[$c] == '"') $ss = !$ss;
19         if ($json[$c] == '{' || $json[$c] == '[') {
20             $crl++;
21             $buffer .= "\n". str_repeat($indentation, $crl);
22         }
23     }
24 
25     // Vrátí HTML zdroj
26     return '<pre>' . $buffer . '</pre>';
27 }
28 
29 // Takto stačí zavolat a vrátí formátovaný výstup
30 // echo jsonColorFormater($data, '  ');

Funkce převzata a radikálně přepsána z: http://stackoverflow.com/…3262/6777550

Převod z JSON do PHP pole / objektu

Lze realizovat funkcí json_decode(), která z Jsonu vyrobí datovou strukturu, s kterou musíme pracovat, jako s objektem:

 1 $json = '{"name":"Jan","surname":"Barasek","role":["admin","moderator"]}';
 2 $decode = json_decode($json);
 3 
 4 echo $decode->name; // Vrátí 'Jan'
 5 
 6 // echo $decode->role;
 7 //      Toto nejde, protože property role
 8 //      obsahuje pole, musíme iterovat.
 9 
10 echo '<ul>';
11 foreach ($decode->role as $role) {
12      echo '<li>' . $role . '</li>'; // Postupně vypíše role za odrážky
13 }
14 echo '</ul>';

Zpracování v javascriptu

Například v knihovně jQuery lze řetězec s JSON naparsovat do objektu velice snadno:

1 var json = '{"name":"Jan","surname":"Barasek","role":["admin","moderator"]}';
2 var parser = $.parseJSON(json);
3 
4 document.write('Jméno: ' + parser.name);
5 console.log(parser); // Vypíše do konzole celý objekt pro možnost ladění
Sponzorované odkazy
Pomohl Vám tento článek?