Если вы когда-нибудь писали на PHP и сталкивались с обменом данными между сервером и клиентом, то наверняка слышали про JSON и XML. Это два популярных формата для передачи структурированной информации. В этой статье мы разберём, как с ними работать в PHP: читать, создавать, преобразовывать и избегать подводных камней. Будет много примеров и практических советов.
Что такое 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 всегда в 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 — для сложных схем и интеграций. И всегда обрабатывайте ошибки, чтобы не ловить «белый экран».
Надеюсь, статья была полезной. Если остались вопросы — пишите, разберёмся вместе.



