Прекратить использовать некорректный JSON в ответах Битрикса

Рейтинг: 12.9937  
Внедрено
Предложил Пользователь 13856 11.01.2015 13:54:28

Прекратить использовать некорректный JSON в ответах Битрикса

При обновлении корзины, при добавлении товара в корзину через AJAX Битрикс возвращает этакий «псевдо-JSON»:
{'STATUS':'OK','MESSAGE':'Товар успешно добавлен в корзину'}

Что с ним не так? У него неправильные кавычки. Из-за этого стандартная JS-функция JSON.parse(), обёртка $.get('...', {}, function() {}, 'json') не работают, потому что не распознают эту фигню.

Неясно, нафига было городить свой дурацкий велосипед, когда можно было в PHP просто использовать json_encode(), которая из массива выдала бы корректный результат, который был бы понятен в обычном JavaScript-е.

Соответственно, предлагаю подобную фигню убрать и впредь использовать корректный JSON.
Рейтинг: 2.1914  
Ответил Жуков Евгений 20.09.2016 16:24:17
Выйдет в iblock 16.5.416.6.1
Update. В обновлении iblock 17.0.0 при рефакторинге эта правка была, увы, затерта. Исправление выйдет в ближайшем обновлении (следующем после iblock 17.0.9)

Рейтинг: 0.9246  
Пользователь 129131 12.01.2015 08:17:49
Добро пожаловать в Bitrix World :D
Рейтинг: 0.85  
Пользователь 13856 12.01.2015 08:27:14
Scrooge, я уж пять лет тут =). Чё-т накатило просто.
Рейтинг: -4.1211  
Пользователь 25773 12.01.2015 14:29:55
Не голосовал против, но как вы себе это представляете для сайтов в кодировках 1251?

JSON по стандарту требует кодировку UTF-16, но данные в UTF-8 подходят. А данные в 1251 не подходят.

Перед упаковкой в JSON давайте все данные из 1251 рекурсивно перегонять в UTF-8.

А после распаковали данные из JSON, давайте конвертировать из UTF в 1251 рекурсивно?

В Битриксе переменная из PHP в javascrpt передается очень просто без всяких JSON:


<?
$arFields = array( "ID", "CODE" );
?>
<sc ript type="text/javascript">
    var arFields=<?=CUtil::PhpToJSObject($arFields);?>;
</sc ript>
Рейтинг: 5.2201  
Пользователь 13856 12.01.2015 14:50:43
Артемий, мне представляется, что сайтов в кодировках 1251 не должно быть уже года три.
Рейтинг: -0.091  
Пользователь 17890 13.01.2015 04:00:43
Добро пожаловать в Bitrix World
добро пожаловать в мир, и в нем нужно находить подходы для решения своих задач
Рейтинг: 1.136  
Пользователь 129131 13.01.2015 06:07:57
добро пожаловать в мир, и в нем нужно находить подходы для решения своих задач
Рейтинг: 1.3178  
Пользователь 13856 11.09.2015 08:23:30
Кстати, если вдруг кому будет интересно, этот говноJSON сами битриксы разбирают вот так:
var json = "тут говноJSON от битрикса";
eval("result = " + json + ";");
Рейтинг: 1.7978  
Пользователь 129131 11.09.2015 09:20:56
Кстати, если вдруг кому будет интересно, этот говноJSON сами битриксы разбирают вот так:
var json = "тут говноJSON от битрикса";
eval("result = " + json + ";");
Это "тру" bx_json :D
Рейтинг: 1.3673  
Пользователь 13539 29.09.2015 14:23:37
А причем тут кодировки???
Описание формата JSON однозначно говорит - двойные кавычки.
http://json.org/json-ru.html

CUtil::PhpToJSObject() - обрамляет в одинарные.

jQuery.getJSON страше 1.4 например одинарные не понимает.
А это значит, что бы написать свою функцию отправки в корзину на jQuery придется писать свою страницу для обработки, возвращающую корректный ответ.
Рейтинг: -0.9243  
Пользователь 283951 21.05.2016 15:02:25
Если вы работаете с 1С-Битрикс, возможно, стоит использовать то, что предлагает система, например BX.ajax
http://dev.1c-bitrix.ru/api_help/main/js_lib/ajax/bx_ajax.php
Рейтинг: 0.795  
Пользователь 106508 19.07.2016 09:35:51
BX.ajax.loadJSON в помощь для таких манипуляций. Но в целом согласен на счет использования JSON согласно стандарту.
Рейтинг: 0.0664  
Пользователь 14496 03.05.2017 22:32:45
Выйдет в iblock 16.5.416.6.1
Дезинформация. Версия iblock 17.0.7
Bitrix\Iblock\Component\Base
protected function processLinkAction()
{
...  
$APPLICATION->RestartBuffer();
echo \CUtil::PhpToJSObject($addResult);
die();
...  
}
Рейтинг: 3.2012  
Пользователь 14496 04.06.2017 10:36:27
Хитрые битриксоиды спрятали решение в коде метода CUtil::PhpToJSObject. Если определить глобальную функцию с секретным именем bx_js_encode, то при работе CUtil::PhpToJSObject будет вызываться именно она и сразу возвращаться ее результат, игнорируя собственный код. Так образом простейшее решение выглядит так:
function bx_js_encode($arData, $bWS, $bSkipTilda, $bExtType){
   return Bitrix\Main\Web\Json::encode($arData)
}
Не понимаю, почему нельзя сразу написать о подобной возможности?