Валидный JSON вместо строки из CUtil::PhpToJSObject в Битрикс
В чём несостыковка
Ядро 1С-Битрикс долго использует метод CUtil::PhpToJSObject как замену json_encode для встраивания PHP-массива во фронтовый код. По сути получается не JSON, а фрагмент JS-объекта: ключи часто без кавычек, строки оборачиваются одинарными кавычками и т. д. Такой литерал нормален для BX*-скриптов ядра, но ломает сценарии, где данные хотят один-в-один передать через JSON.parse().
Современный стандарт в D7
Для тех же задач во фреймворке D7 логичнее сразу вызывать Bitrix\Main\Web\Json::encode(): в режиме UTF-8 там используется штатный json_encode, результат соответствует спецификации JSON.
Подключение через bx_js_encode
Внутри CUtil::PhpToJSObject заложен хук на глобальную пользовательскую функцию с именем bx_js_encode. Если она объявлена, ядро отдаёт ей уже подготовленную структуру данных и параметры белого пробела, экранирования тильды и расширенных типов. Достаточно один раз подключить файл с реализацией (инициализация модуля, init.php и т. п.) до первого вызова PhpToJSObject.
function bx_js_encode($payloadStruct, $flagPrettyPrint, $flagSkipTilde, $flagExtTypes)
{
return \Bitrix\Main\Web\Json::encode($payloadStruct);
}Если не нужно тянуть класс из пространства имён ядра, достаточно вернуть json_encode($payloadStruct, JSON_UNESCAPED_UNICODE) для латиницы и кириллицы в ключах без экранирования Юникода.
После подключения обёртки всё содержимое, которое раньше уходило в «компактный JS», станет строкой формальной JSON там, где сработает этот кодовый путь. Учитывайте совместимость с устаревшим JS-теми местами ядра, которые читают объектный литерал без строгого JSON: при глобальной подмене стоит прогнать критические сценарии в административной части и публичных шаблонах.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии