Если вы когда-нибудь писали на PHP и сталкивались с обменом данными между сервером и клиентом, то наверняка слышали про JSON и XML. Это два популярных формата для передачи структурированной информации. В этой статье мы разберём, как с ними работать в PHP: читать, создавать, преобразовывать и избегать подводных камней. Будет много примеров и практических советов.

Digital-студия WNDER

Что такое JSON и XML и зачем они нужны

JSON (JavaScript Object Notation) — это лёгкий формат обмена данными, основанный на синтаксисе JavaScript. Он читается людьми и легко парсится машинами. XML (eXtensible Markup Language) — более старый и формальный язык разметки, который часто используется в корпоративных системах, SOAP-сервисах и RSS-лентах.

Оба формата позволяют представить сложные структуры: объекты, массивы, вложенные данные. Но JSON компактнее и проще, а XML — более гибкий и расширяемый. В PHP есть встроенные функции для работы с обоими.

Работа с JSON в PHP: функции и примеры

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

Пример кодирования массива:

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

$json = json_encode($data, JSON_UNESCAPED_UNICODE);
echo $json;
// {"name":"Иван","age":30,"skills":["PHP","JavaScript","MySQL"]}

Обратите внимание на флаг JSON_UNESCAPED_UNICODE — он сохраняет русские буквы читаемыми, а не в виде \u0438 и т.п.

Теперь декодирование:

$jsonString = '{"name":"Иван","age":30,"skills":["PHP","JavaScript","MySQL"]}';
$data = json_decode($jsonString, true); // true — вернуть ассоциативный массив

echo $data['name']; // Иван
echo $data['skills'][0]; // PHP

Если не передать true, то json_decode() вернёт объект stdClass. С ним тоже можно работать, но массивы часто удобнее.

Обработка ошибок JSON

JSON может быть некорректным. Чтобы не гадать, используйте json_last_error() и json_last_error_msg().

$badJson = '{"name":"Иван","age":30,}'; // лишняя запятая
$data = json_decode($badJson, true);

if (json_last_error() !== JSON_ERROR_NONE) {
    echo 'Ошибка: ' . json_last_error_msg();
}
Правило: Всегда проверяйте результат json_decode() на null и смотрите json_last_error(). Это сэкономит часы отладки.

Работа с XML в PHP: просто и с примерами

XML в PHP можно обрабатывать несколькими способами: SimpleXML, DOM, XMLReader. Для большинства задач хватает SimpleXML — он простой и интуитивный.

Пример чтения XML:

$xmlString = '

    Иван
    30
    
        PHP
        JavaScript
        MySQL
    
';

$xml = simplexml_load_string($xmlString);
echo $xml->name; // Иван
echo $xml->skills->skill[0]; // PHP

Создание XML:

$xml = new SimpleXMLElement('');
$xml->addChild('name', 'Иван');
$xml->addChild('age', 30);
$skills = $xml->addChild('skills');
$skills->addChild('skill', 'PHP');
$skills->addChild('skill', 'JavaScript');
$skills->addChild('skill', 'MySQL');

echo $xml->asXML();

SimpleXML хорош для чтения и создания небольших документов. Для больших файлов лучше использовать XMLReader (потоковый парсер) или DOM (более мощный, но требовательный к памяти).

Преобразование между JSON и XML

Иногда нужно конвертировать данные из одного формата в другой. Прямых функций нет, но можно написать простой конвертер.

JSON в XML:

function jsonToXml($json) {
    $data = json_decode($json, true);
    $xml = new SimpleXMLElement('');
    arrayToXml($data, $xml);
    return $xml->asXML();
}

function arrayToXml($array, &$xml) {
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $subnode = $xml->addChild($key);
            arrayToXml($value, $subnode);
        } else {
            $xml->addChild($key, htmlspecialchars($value));
        }
    }
}

$json = '{"name":"Иван","age":30,"skills":["PHP","JavaScript"]}';
echo jsonToXml($json);

XML в JSON:

function xmlToJson($xmlString) {
    $xml = simplexml_load_string($xmlString);
    $json = json_encode($xml);
    return $json;
}

$xml = 'Иван30';
echo xmlToJson($xml);
// {"name":"Иван","age":"30"}

Учтите, что SimpleXML возвращает все значения как строки, поэтому числа могут стать строками в JSON.

Сравнение JSON и XML: что выбрать

Оба формата имеют свои сильные и слабые стороны. Вот краткое сравнение:

Критерий JSON XML
Читаемость Высокая Средняя
Размер Компактный Громоздкий
Поддержка в PHP Встроенная Встроенная (SimpleXML, DOM)
Схема и валидация Слабая Мощная (XSD, DTD)
Использование в API Повсеместно В корпоративных системах

Для большинства современных веб-приложений JSON — выбор по умолчанию. XML остаётся в legacy-системах, SOAP и там, где нужна строгая валидация.

Лайфхак: Если вам нужно отдать данные клиенту, используйте JSON. Если интегрируетесь с банком или госсистемой — скорее всего, там будет XML.

Практические советы и типичные ошибки

Вот несколько граблей, на которые наступают почти все:

  • Кодировка. JSON всегда в UTF-8. Если у вас другая кодировка, сначала преобразуйте через mb_convert_encoding().
  • Глубина вложенности. json_decode() по умолчанию имеет лимит 512 уровней. Можно увеличить третьим аргументом.
  • XML и пространства имён. SimpleXML требует указывать пространства имён при обращении к элементам. Например, $xml->children('ns', true).
  • Экранирование. При создании XML через SimpleXML специальные символы автоматически экранируются. Но при ручной сборке строк не забывайте про htmlspecialchars().
  • Производительность. Для больших XML-файлов используйте XMLReader или SAX-парсер. Для JSON — json_decode() с флагом JSON_BIGINT_AS_STRING, если числа огромные.

Ещё один момент: не забывайте про безопасность. Никогда не доверяйте данным из внешних источников. Всегда проверяйте структуру и типы после декодирования.

// Пример безопасного декодирования
$json = file_get_contents('https://api.example.com/data');
$data = json_decode($json, true);

if (json_last_error() !== JSON_ERROR_NONE) {
    throw new Exception('Некорректный JSON');
}

if (!isset($data['user']['id'])) {
    throw new Exception('Отсутствует обязательное поле');
}

Итог

JSON и XML — это два инструмента для одной задачи: структурированной передачи данных. В PHP есть всё необходимое для работы с ними: json_encode(), json_decode(), SimpleXML, DOM, XMLReader. Выбирайте формат под задачу: JSON — для современных API и простоты, XML — для сложных схем и интеграций. И всегда обрабатывайте ошибки, чтобы не ловить «белый экран».

Надеюсь, статья была полезной. Если остались вопросы — пишите, разберёмся вместе.

Студия WNDER