Формат даних Json був створений для полегшення передачі структурованих даних між клієнтом і сервером.
Для перетворення масиву або об'єкта в Json в PHP існує функція json_encode
:
$user = ['ім'я' => 'Ян','прізвище' => 'Барасек','роль' => ['Адміністратор','модератор',],];echo json_encode($user);
Він згенерує:
{"name":"Jan","surname":"Barasek","role":["admin","moderator"]}
Функція json_encode()
може також конвертувати інші типи даних. Наприклад, ми можемо безпосередньо вставити integer
(ціле число), string
(рядок) і так далі.
За замовчуванням json генерується як один довгий рядок. Це зроблено для того, щоб займати якомога менше місця.
Якщо вам потрібна краща читабельність для людини, просто передайте константу JSON_PRETTY_PRINT
як другий параметр:
echo json_encode($users, JSON_PRETTY_PRINT);
Він згенерує:
{"ім'я": "Ян","прізвище": "Барасек","роль": ["Адміністратор","модератор"]}
Звичайне форматування json через PHP не має додаткових налаштувань і доводиться задовольнятися тільки таким виводом. Наприклад, якщо ми хочемо зробити відступ табуляції замість пробілів (або якимось чином змінити правила генерації), нам доведеться програмувати це самостійно.
Ця функція вже вміє робити базове форматування і нам просто потрібно її модифікувати:
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;}
Джерело: https://stackoverflow.com/questions/6054033/pretty…
Наприклад, вхідні:
{"key1":[1,2,3],"ключ2":"значення"}
Відформатовано як:
{"key1": [1,2,3],"ключ2": "значення"}
Який набагато легше читається (завдяки послідовному відступу кожного елементу).
Іноді буває корисно виділити кольором клавіші, самі дані та окремі елементи форматування (особливо дужки, що закриваються).
Наприклад, вхідні:
{"доступ": {"маркер": {"видано_на": "2008-08-16T14:10:31.309353", "закінчується": "2008-08-17T14:10:31Z", "ідентифікатор": "MIICQgYJKoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"}, "СервісКаталог": [], "користувач": {"ім'я користувача": "сойка", "roles_links": [], "ідентифікатор": "16452ca89", "ролі": [], "ім'я": "сойка"}}}
Відформатовано як:
{
"доступ": {{br>}
"токен": {
</span
"issued_at": "2008-08-16T14:10:31.309353",
"закінчується": "2008-08-17T14:10:31Z",
"id": "MIICQgYJKoZIhvcIegeyJpc3N1ZWRfYXQiOiAi"
</span
},
.
"Каталог послуг": [
[<br
],
.
"користувач": {{br>}
"username": "ajay",
"roles_links": [
[
],
.
: "16452ca89",
.
"ролі": [
[
],
.
"name": "ajay"
}
}
.
}
Це може бути реалізовано за допомогою наступної функції:
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> </span>.';if ($json[$c] == '"') $ss = !$ss;if ($json[$c] == '{' || $json[$c] == '[') {$crl++;$buffer .= "\n". str_repeat($indentation, $crl);}}// Повертає HTML-джерелоreturn '<pre>' . $buffer . '</pre> </pre';}// Просто викликати цю функцію і повернути відформатований вивід// echo jsonColorFormater($data, ' ');
Матеріал взятий і докорінно переписаний з: https://stackoverflow.com/a/20953262/6777550
Це можна реалізувати за допомогою функції json_decode(), яка робить з Json структуру даних, з якою ми маємо працювати як з об'єктом:
$json = '{"author": "Jan", "прізвище": "Barasek", "role":["admin", "moderator"]}.';$decode = json_decode($json);echo $decode->name; // Повертає 'Jan'// echo $decode->role;//// Це неможливо, тому що роль власності// містить масив, потрібно виконати ітерацію.echo '<ul>';foreach ($decode->role as $role) {echo '<li>' . $role . '</li> </li> </ul>.'; // Послідовно перераховує ролі, що стоять за кулями}echo '</ul> </li> <ul>.';
Наприклад, в бібліотеці jQuery json-рядок дуже легко розбирається в об'єкт:
var json = '{"author": "Jan", "прізвище": "Barasek", "role":["admin", "moderator"]}.';var parser = $.parseJSON(json);document.write('Ім'я:' + parser.name);console.log(parser); // Виводить весь об'єкт в консоль для налагодження
У javascript, в загальному випадку, будь-який json є дійсним об'єктом javascript, з яким можна працювати безпосередньо та отримувати доступ до його властивостей.
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: ... | uk