PHP Manual

Json в PHP - обробка, генерація та форматування

26. 11. 2019

Obsah článku

Формат даних Json був створений для полегшення передачі структурованих даних між клієнтом і сервером.

Перетворення масиву або об'єкту в json

Для перетворення масиву або об'єкта в Json в PHP існує функція json_encode:

$user = [
'ім'я' => 'Ян',
'прізвище' => 'Барасек',
'роль' => [
'Адміністратор',
'модератор',
],
];
echo json_encode($user);

Він згенерує:

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

Функція json_encode() може також конвертувати інші типи даних. Наприклад, ми можемо безпосередньо вставити integer (ціле число), string (рядок) і так далі.

Json гарний шрифт - краща читабельність для людини

За замовчуванням json генерується як один довгий рядок. Це зроблено для того, щоб займати якомога менше місця.

Якщо вам потрібна краща читабельність для людини, просто передайте константу JSON_PRETTY_PRINT як другий параметр:

echo json_encode($users, JSON_PRETTY_PRINT);

Він згенерує:

{
"ім'я": "Ян",
"прізвище": "Барасек",
"роль": [
"Адміністратор",
"модератор"
]
}

Форматування json - користувацькі правила форматування

Звичайне форматування 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": "значення"
}

Який набагато легше читається (завдяки послідовному відступу кожного елементу).

Розфарбовування json нотації як HTML

Іноді буває корисно виділити кольором клавіші, самі дані та окремі елементи форматування (особливо дужки, що закриваються).

Наприклад, вхідні:

{"доступ": {"маркер": {"видано_на": "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 в PHP масив/об'єкт

Це можна реалізувати за допомогою функції 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>.';

Обробка на javascript

Наприклад, в бібліотеці 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:

Související články

1.
Status:
All systems normal.
2024