<MyRusakov.ru />

Профессиональная Web-разработка. Дизайн, код и автоматизация

Профессиональная Web-разработка. Дизайн, код и автоматизация

Это очень подробный курс из разряда "всё включено". Разбираются следующие темы: HTML, CSS, SCSS, JavaScript, PHP, SQL, Laravel, Nginx, PostCSS, npm, Vite, Vitest, Composer, PHPUnit, Prettier, Stylelint, ESLint, Pint, Larastan, Git, Agile, Scrum, Docker, Supervisord, Figma, Stitch AI, Confluence, Jira.

Рассчитан и на новичков, и на тех, кто уже знаком с основами, но хочет освоить полный цикл разработки.

Помимо самой теории, Вы увидите пример создания Web-проекта на 20 000 строк кода: от идеи и документации на Confluence через планирование на Jira, fullstack-разработку до деплоя на VPS.

Помимо уроков, курс содержит упражнения для закрепления знаний и финальное тестирование. А ещё Вы получите 5 полноценных Бонусных курсов: «GitLab под ключ», «Вёрстка сайта с нуля 2.0», «JavaScript с Нуля до Гуру 2.0», «PHP и MySQL с Нуля до Гуру 3.0» и «Laravel от А до Я».

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

JSON в PHP: json_encode и json_decode — практическое практическое руководство для начинающих

JSON в PHP: json_encode и json_decode — практическое практическое руководство для начинающих

Запрос “JSON в PHP: json_encode, json_decode” стабильно в топе у начинающих. И недаром: именно через JSON большинство PHP‑приложений общаются с фронтендом и внешними сервисами. Разберем базу и лучшие практики: от правильных заголовков до флагов, ошибок и мини‑API без фреймворков.

Базовый пример: как отдать JSON из PHP

Главное — выставить корректный заголовок и закодировать данные в UTF‑8.

<?php
$data = [
  'ok' => true,
  'user' => ['id' => 42, 'name' => 'Иван'],
];

header('Content-Type: application/json; charset=utf-8');
// Не экранируем Юникод и слеши, чтобы строка была читаемой
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

По умолчанию json_encode экранирует русские буквы как \u0418\u0432... — флаги выше это исправляют.

json_encode: важные флаги, о которых забывают

  • JSON_UNESCAPED_UNICODE — не экранировать Unicode (удобнее читать).
  • JSON_UNESCAPED_SLASHES — не экранировать \/ в URL.
  • JSON_PRETTY_PRINT — форматировать вывод (для логов/отладки).
  • JSON_PRESERVE_ZERO_FRACTION — сохранить 0.0 как число с дробной частью.
  • JSON_INVALID_UTF8_SUBSTITUTE — заменить битые байты на � вместо фатала.
  • JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS|JSON_HEX_QUOT — безопасная встраивка JSON в HTML.
<?php
$city = ['city' => 'Москва', 'url' => 'https://example.com/a/b'];
echo json_encode($city, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);

$price = ['price' => 10.0, 'discount' => 0.0];
echo json_encode($price, JSON_PRESERVE_ZERO_FRACTION); // 0.0 сохранится как 0.0

$bad = ['text' => "Invalid \xC3"];
echo json_encode($bad, JSON_INVALID_UTF8_SUBSTITUTE);

json_decode: массив или объект, глубина и большие числа

json_decode по умолчанию возвращает объект stdClass. Чтобы получить ассоциативный массив, передайте true вторым параметром.

<?php
$json = '{"ok":true,"user":{"id":42,"name":"Иван"}}';

// Ассоциативный массив
$arr = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
// Объект stdClass
$obj = json_decode($json, false, 512, JSON_THROW_ON_ERROR);

Параметр глубины (по умолчанию 512) защищает от слишком вложенных структур. Для очень больших чисел используйте JSON_BIGINT_AS_STRING — иначе число может потерять точность.

<?php
$json = '{"id": 9223372036854775808}'; // больше, чем PHP_INT_MAX
$assoc = json_decode($json, true, 512, JSON_THROW_ON_ERROR | JSON_BIGINT_AS_STRING);
var_dump($assoc['id']); // string(19) "9223372036854775808"

Безопасная обработка ошибок: JSON_THROW_ON_ERROR

Старый способ — проверять json_last_error(). Современный и удобный — ловить JsonException с флагом JSON_THROW_ON_ERROR.

<?php
try {
  // Ошибка: лишняя запятая
  $data = json_decode('{"a":1,}', true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
  http_response_code(400);
  echo json_encode(['error' => $e->getMessage()], JSON_UNESCAPED_UNICODE);
}

Мини‑API на чистом PHP: принимаем и отдаем JSON

Пример обработчика POST /greet, который принимает JSON {"name": "Иван"} и возвращает приветствие.

<?php
declare(strict_types=1);

header('Content-Type: application/json; charset=utf-8');

if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST') {
  http_response_code(405);
  echo json_encode(['error' => 'Method Not Allowed'], JSON_UNESCAPED_UNICODE);
  exit;
}

if (stripos($_SERVER['CONTENT_TYPE'] ?? '', 'application/json') !== 0) {
  http_response_code(415);
  echo json_encode(['error' => 'Expected application/json'], JSON_UNESCAPED_UNICODE);
  exit;
}

$raw = file_get_contents('php://input');
try {
  $in = json_decode($raw, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
  http_response_code(400);
  echo json_encode(['error' => 'Invalid JSON', 'details' => $e->getMessage()], JSON_UNESCAPED_UNICODE);
  exit;
}

$name = trim((string)($in['name'] ?? 'Гость'));
$out = ['ok' => true, 'greeting' => "Привет, $name"]; 

echo json_encode($out, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

Такой скрипт можно запускать на встроенном веб‑сервере PHP для локальной отладки: php -S localhost:8000.

Частые ошибки и как их избежать

  • Нет заголовка Content-Type. Браузер и клиенты не понимают, что это JSON. Всегда отправляйте header('Content-Type: application/json; charset=utf-8').
  • Двойное кодирование. Нельзя передавать в json_encode уже закодированную строку JSON — получите строки в кавычках внутри JSON.
  • Потеря нулей после запятой. Добавляйте JSON_PRESERVE_ZERO_FRACTION, если важно 0.0 vs 0.
  • Числовые строки становятся числами. Флаг JSON_NUMERIC_CHECK в encode преобразует строки вида "00123" в число 123 — аккуратно с артикульными кодами/телефонами.
  • Большие числа ломаются. При decode используйте JSON_BIGINT_AS_STRING, иначе потеря точности неизбежна.
  • Битая кодировка. Следите, чтобы входные строки были в UTF‑8; при encode добавляйте JSON_INVALID_UTF8_SUBSTITUTE.
  • Вывод до заголовков. Любой echo до header() ломает заголовки. Используйте буферизацию или выводите строго после header().
  • Встраивание JSON в HTML. Экранируйте опасные символы флагами JSON_HEX_*.

Полезные приемы

Безопасная встраиваемая переменная в HTML:

<?php
$state = [
  'csrf' => bin2hex(random_bytes(16)),
  'user' => ['id' => 1, 'name' => '<script>alert(1)</script>'],
];
$json = json_encode($state, JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS|JSON_HEX_QUOT|JSON_UNESCAPED_UNICODE);
?>
<script>
  window.__STATE__ = <?php echo $json; ?>;
</script>

Построчная передача больших данных (NDJSON):

<?php
header('Content-Type: application/x-ndjson; charset=utf-8');
foreach ($rows as $row) {
  echo json_encode($row, JSON_UNESCAPED_UNICODE), "\n";
  flush();
}

Итоги

Запомните основу: правильный Content-Type, нужные флаги encode/decode, и обработка ошибок через JSON_THROW_ON_ERROR. Этого достаточно, чтобы уверенно работать с JSON в PHP и писать аккуратные API.

Хотите системно прокачаться и пройти путь от основ до продвинутых тем (PDO, безопасность, MySQL, практика)? Тогда загляните в курс: Пройти практический курс «PHP и MySQL с Нуля до Гуру 3.0» →

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (https://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: https://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: https://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.