Если вы хоть раз писали на PHP, то наверняка сталкивались с ситуацией, когда нужно получить данные от одного сервиса и передать их другому. Или просто сохранить настройки сайта в удобном виде. Тут на сцену выходят два главных героя — JSON и XML. Они как два брата: один — современный и быстрый, второй — старший, но всё ещё в строю. В этой статье разберём, как с ними работать в PHP, что выбрать и как не наступить на грабли.

Digital-студия WNDER

Что такое JSON и XML, и почему они повсюду

JSON (JavaScript Object Notation) — это формат обмена данными, который выглядит как обычный текст, но с чёткой структурой. Представьте, что вы записываете список покупок на бумажке: «молоко, хлеб, яблоки». В JSON это будет выглядеть как список в фигурных скобках. Он лёгкий, человекочитаемый и его понимают все языки программирования. Именно поэтому его используют в API, конфигах и даже в базах данных (например, в PostgreSQL есть тип JSON).

XML (eXtensible Markup Language) — старичок, который появился ещё в 1998 году. Он похож на HTML, только теги можно придумывать самому. Выглядит громоздко:

молоко
. Но он до сих пор жив в банковской сфере, в старых системах и в форматах вроде RSS или SOAP. Если вы работаете с легаси-проектами, то без XML никуда.

В PHP есть встроенные функции для обоих форматов. Это значит, что подключать сторонние библиотеки не нужно — всё уже есть в ядре. Осталось только разобраться, как ими пользоваться.

Работа с JSON в PHP: от простого к сложному

PHP умеет превращать JSON в массив или объект и обратно. Для этого есть две функции: json_encode() и json_decode(). Первая превращает массив в JSON-строку, вторая — наоборот.

Вот как это выглядит на практике:

$user = [
    'name' => 'Иван',
    'age' => 30,
    'skills' => ['PHP', 'JavaScript']
];

$jsonString = json_encode($user);
echo $jsonString;
// Выведет: {"name":"Иван","age":30,"skills":["PHP","JavaScript"]}

$decoded = json_decode($jsonString, true); // true возвращает массив, без него — объект
print_r($decoded);

Обратите внимание на второй аргумент в json_decode(). Если передать true, получите ассоциативный массив. Если не передавать — получите объект. Это важно, потому что дальше вы будете обращаться к данным по-разному:

  • Массив: $decoded['name']
  • Объект: $decoded->name

Если вы не уверены, что получите, лучше всегда передавайте true — так проще работать.

Как проверить, что JSON валиден

Бывает, что вы получаете строку, которая должна быть JSON, но что-то пошло не так. Чтобы не получить ошибку, нужно проверить результат. В PHP есть функция json_last_error(), которая возвращает код последней ошибки. Если код равен JSON_ERROR_NONE, значит всё ок.

Вот как это выглядит:

$json = '{"name": "Иван"}'; // допустим, это данные от API
$data = json_decode($json, true);

if (json_last_error() !== JSON_ERROR_NONE) {
    echo 'Ошибка JSON: ' . json_last_error_msg();
} else {
    echo 'Всё хорошо, имя: ' . $data['name'];
}

Функция json_last_error_msg() вернёт человекочитаемое описание ошибки. Это очень помогает при отладке.

Работа с XML в PHP: парсим и создаём

С XML всё немного сложнее. В PHP есть два основных способа: SimpleXML и DOMDocument. SimpleXML — проще, но подходит для небольших файлов. DOMDocument — мощнее, но требует больше кода.

Разберём SimpleXML на примере:

$xmlString = 'Иван30';
$xml = simplexml_load_string($xmlString);

// Обращаемся к элементам как к свойствам
echo $xml->name; // Иван
echo $xml->age;  // 30

Если XML содержит списки, то можно перебирать их как массивы:

$xmlString = 'ИванПетр';
$xml = simplexml_load_string($xmlString);

foreach ($xml->user as $user) {
    echo $user->name . PHP_EOL;
}

Чтобы создать XML, используйте DOMDocument:

$doc = new DOMDocument('1.0', 'utf-8');
$root = $doc->createElement('users');
$doc->appendChild($root);

$user = $doc->createElement('user');
$name = $doc->createElement('name', 'Иван');
$user->appendChild($name);
$root->appendChild($user);

echo $doc->saveXML();

Этот код выведет XML-строку с одним пользователем. Если нужно больше — просто повторяйте создание элементов.

JSON или XML: что выбрать

Тут нет однозначного ответа. Всё зависит от задачи. Я составил таблицу сравнения, чтобы вам было проще решить.

КритерийJSONXML
Размер данныхМеньшеБольше (из-за тегов)
Скорость парсингаБыстрееМедленнее
ЧитаемостьЛегкоСредне
Поддержка типов данныхДа (числа, булевы)Нет (всё строки)
Сложность структурыПростаяПоддерживает атрибуты, пространства имён
Где используетсяAPI, конфиги, вебСтарые системы, документы

В большинстве современных проектов выбирают JSON. Он легче и быстрее. Но если вы работаете с наследием или с системами, где XML обязателен, придётся использовать его.

Правило: Если не знаете, что выбрать, берите JSON. Он проще и универсальнее. XML используйте только тогда, когда этого требуют внешние системы или спецификации.

Лайфхаки и частые ошибки

Вот несколько советов, которые сэкономят вам нервы:

  • Всегда проверяйте кодировку. JSON и XML должны быть в UTF-8. Если данные приходят в другой кодировке, сначала перекодируйте через mb_convert_encoding().
  • Используйте JSON_THROW_ON_ERROR в json_decode(). Начиная с PHP 7.3, можно передать флаг JSON_THROW_ON_ERROR, и тогда вместо молчаливой ошибки вы получите исключение. Это удобнее для отладки.
  • Не доверяйте внешним данным. Если вы получаете JSON или XML от стороннего API, всегда обрабатывайте ошибки. Вдруг сервер вернул HTML вместо JSON?
  • Для больших XML используйте XMLReader. SimpleXML загружает весь документ в память, а это может быть накладно. XMLReader читает файл потоково.

Частая ошибка — забыть про экранирование спецсимволов в XML. Если вы вставляете пользовательский текст в XML, обязательно используйте htmlspecialchars() или DOMDocument::createTextNode(), иначе теги сломают структуру.

Что в итоге

JSON и XML — это два основных формата обмена данными в вебе. PHP предоставляет все необходимые инструменты для работы с ними. JSON — современный выбор для API и конфигураций, XML — незаменим в старых системах и форматах с жёсткой структурой.

Главное — всегда проверяйте ошибки, следите за кодировкой и выбирайте инструмент под задачу. Теперь вы знаете, как это делать. Удачи в кодинге!

Студия WNDER