Format danych Json został stworzony w celu ułatwienia przesyłania ustrukturyzowanych danych między klientem a serwerem.
Aby przekonwertować tablicę lub obiekt na Json, w PHP istnieje funkcja json_encode
:
$user = ['nazwa' => 'Jan','nazwisko' => 'Barasek','rola' => ['Administrator','moderator',],];echo json_encode($user);
Będzie generować:
{"name":"Jan","surname":"Barasek","role":["admin","moderator"]}
Funkcja json_encode()
może również konwertować inne typy danych. Na przykład, możemy bezpośrednio wstawić integer
(liczba całkowita), string
(łańcuch znaków) i tak dalej.
W domyślnej konfiguracji json jest generowany jako jeden długi ciąg znaków. Dzieje się tak dlatego, aby zajmowały jak najmniej miejsca.
Jeśli wymagana jest lepsza czytelność dla człowieka, wystarczy przekazać stałą JSON_PRETTY_PRINT
jako drugi parametr:
echo json_encode($users, JSON_PRETTY_PRINT);
Będzie generować:
{"nazwa": "Jan","nazwisko": "Barasek","rola": ["Administrator","moderator"]}
Normalne formatowanie json za pomocą PHP nie ma żadnych dodatkowych ustawień i musimy zadowolić się tylko tym wyjściem. Na przykład, jeśli chcemy wciskać tabulatory zamiast spacji (lub w jakikolwiek sposób zmodyfikować reguły generowania), musimy sami to zaprogramować.
Funkcja ta potrafi już wykonywać podstawowe formatowanie, wystarczy ją tylko zmodyfikować:
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;}
Źródło: https://stackoverflow.com/questions/6054033/pretty…
Na przykład dane wejściowe:
{"klawisz1":[1,2,3],"klucz2":"wartość"}
Sformatowane jako:
{"klawisz1": [1,2,3],"klucz2": "wartość"}
Jest to znacznie łatwiejsze do odczytania (ze względu na spójne wcięcie każdego elementu).
Czasami przydatne może być podświetlenie kolorem klawiszy, samych danych oraz poszczególnych elementów formatowania (zwłaszcza nawiasów zamykających).
Na przykład dane wejściowe:
{"dostęp": {"token": {"wydany_at": "2008-08-16T14:10:31.309353", "wygasa": "2008-08-17T14:10:31Z", "id": "MIICQgYJKoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"}, "serviceCatalog": [], "użytkownik": {"nazwa użytkownika": "ajay", "role_linki": [], "id": "16452ca89", "role": [], "nazwa": "ajay"}}}
Sformatowane jako:
{
"access": {
"token": {
"issued_at": "2008-08-16T14:10:31.309353",
"expires": "2008-08-17T14:10:31Z",
"id": "MIICQgYJKoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"
},
"serviceCatalog": [
],
"user": {
"nazwa użytkownika": "ajay",
"role_links": [
],
: "16452ca89",
.
"role": [
],
"name": "ajay"
.
}
}
}
Można to zrobić za pomocą następującej funkcji:
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);}}// Zwraca źródło HTMLreturn '<pre>.' . $buffer . '</pre>.';}// Po prostu wywołaj to i zwróć sformatowane dane wyjściowe// echo jsonColorFormater($data, ' ');
Cechy zaczerpnięte i radykalnie przerobione z: https://stackoverflow.com/a/20953262/6777550
Można to zrealizować za pomocą funkcji json_decode(), która tworzy z Json strukturę danych, z którą musimy pracować jako z obiektem:
$json = '{"name": "Jan", "surname": "Barasek", "role":["admin", "moderator"]}';$decode = json_decode($json);echo $decode->name; // Zwraca "Jan".// echo $decode->role;//// Nie jest to możliwe, ponieważ rola właściwości// zawiera tablicę, musimy wykonać iterację.echo '<ul>.';foreach ($decode->role as $role) {echo '<li>.' . $role . '</li>.'; // Kolejno wymienia role, które kryją się za kulami}echo '</ul>.';
Na przykład w bibliotece jQuery ciąg znaków json można bardzo łatwo przekształcić w obiekt:
var json = '{"name": "Jan", "surname": "Barasek", "role":["admin", "moderator"]}';var parser = $.parseJSON(json);document.write('Nazwa:' + parser.name);console.log(parser); // Drukuje cały obiekt na konsolę w celu ułatwienia debugowania
Ogólnie w języku javascript każdy json jest poprawnym obiektem javascript, z którym można pracować bezpośrednio i korzystać z jego właściwości.
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:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | pl