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

Digital-студия WNDER

JSON: легко, быстро, современно

JSON (JavaScript Object Notation) — это текстовый формат обмена данными. Выглядит как набор пар «ключ: значение», очень похож на массивы в PHP. Его любят за простоту и читаемость. В PHP для работы с JSON есть две основные функции: json_encode() и json_decode().

Пример: у нас есть массив с данными пользователя. Превратим его в JSON-строку:

$user = [
    'name' => 'Иван',
    'age' => 30,
    'email' => 'ivan@example.com'
];
$json = json_encode($user);
echo $json;
// {"name":"Иван","age":30,"email":"ivan@example.com"}

А теперь обратная задача: получить из JSON-строки массив или объект. По умолчанию json_decode() возвращает объект, но можно передать второй аргумент true, чтобы получить ассоциативный массив:

$jsonString = '{"name":"Иван","age":30,"email":"ivan@example.com"}';
$data = json_decode($jsonString, true);
print_r($data);
// Array ( [name] => Иван [age] => 30 [email] => ivan@example.com )

Всё просто, правда? Но есть нюансы. Например, если JSON-строка битая, json_decode() вернёт null. Всегда проверяйте ошибки с помощью json_last_error().

XML: мощно, но многословно

XML (eXtensible Markup Language) — это язык разметки, где данные обёрнуты в теги. Он строже JSON и поддерживает атрибуты, пространства имён, схемы. В PHP для работы с XML есть несколько расширений: SimpleXML, DOM, XMLReader. Начнём с SimpleXML — самого простого.

Допустим, есть XML-строка:

$xmlString = '<?xml version="1.0"?>
<user>
    <name>Иван</name>
    <age>30</age>
    <email>ivan@example.com</email>
</user>';
$xml = simplexml_load_string($xmlString);
echo $xml->name; // Иван
echo $xml->age;  // 30

SimpleXML превращает XML в объект, с которым можно работать как с обычными свойствами. Но если XML сложный (с атрибутами, вложенными пространствами имён), лучше использовать DOMDocument. Он даёт полный контроль над структурой.

Пример с DOMDocument:

$dom = new DOMDocument();
$dom->loadXML($xmlString);
$name = $dom->getElementsByTagName('name')->item(0)->nodeValue;
echo $name; // Иван

Для генерации XML можно использовать SimpleXMLElement или DOMDocument. Вот как создать простой XML с помощью SimpleXML:

$xml = new SimpleXMLElement('<user></user>');
$xml->addChild('name', 'Иван');
$xml->addChild('age', 30);
$xml->addChild('email', 'ivan@example.com');
echo $xml->asXML();

Сравнение JSON и XML: таблица

Чтобы легче было выбрать формат, вот сравнительная таблица:

Критерий JSON XML
Читаемость Высокая Средняя (много тегов)
Размер данных Компактный Более объёмный
Поддержка в PHP Встроенные функции Несколько расширений
Сложные структуры Ограниченно Гибко (атрибуты, пространства имён)
Скорость обработки Выше Ниже

Правила и лайфхаки

Правило: Всегда проверяйте данные на валидность после декодирования. JSON может вернуть null, а XML — вызвать ошибку при загрузке. Используйте json_last_error() и libxml_use_internal_errors() для перехвата ошибок.
  • Для JSON используйте флаг JSON_UNESCAPED_UNICODE, чтобы кириллица не превращалась в \uXXXX.
  • При работе с XML отключайте загрузку внешних сущностей (libxml_disable_entity_loader), чтобы избежать XXE-атак.
  • Если нужно преобразовать XML в массив, используйте json_decode(json_encode(simplexml_load_string($xml)), true) — быстрый хак.
  • Для больших XML-файлов используйте XMLReader — он читает потоково и экономит память.

Что в итоге?

JSON проще и быстрее, идеален для REST API и обмена данными между современными сервисами. XML мощнее и гибче, но требует больше кода и ресурсов. В PHP оба формата поддерживаются «из коробки», так что выбор зависит от задачи. Если вам нужно быстро и просто — берите JSON. Если важна строгая структура и расширяемость — XML.

И помните: всегда проверяйте ошибки и не доверяйте входным данным. Удачи в кодинге!

Студия WNDER