PHP Manual
/
Struktury danych

Json w PHP - przetwarzanie, generowanie i formatowanie

26. 11. 2019

Obsah článku

Format danych Json został stworzony w celu ułatwienia przesyłania ustrukturyzowanych danych między klientem a serwerem.

Konwersja tablicy lub obiektu do formatu json

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.

Json ładny druk - lepsza czytelność dla człowieka

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"
]
}

Formatowanie json - niestandardowe reguły formatowania

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).

Kolorowanie notacji json jako HTML

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 HTML
return '<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

Konwersja z JSON na tablicę/obiekt PHP

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>.';

Przetwarzanie w javascript

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:

Související články

1.
Status:
All systems normal.
2024