Содержание
- json_decode возвращает JSON_ERROR_SYNTAX, но он-лайн форматировщик говорит, что JSON в порядке
- Решение
- Другие решения
- Bitrix: JSON error: Syntax error
- json error syntax error 4
- Решение
- Другие решения
- Описание
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- json_last_error
- Описание
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- Предопределённые константы
json_decode возвращает JSON_ERROR_SYNTAX, но он-лайн форматировщик говорит, что JSON в порядке
У меня очень странная проблема.
У меня есть веб-сервис JSON.
Но когда я загружаю свой JSON с этим кодом:
Я получил ошибку: SYNTAX ERROR
ЧТО НЕ ПОМОГАЕТ ПОЛНОЙ ВСЕ.
(но мне пока не удалось установить PHP 5.5, и я не уверен, что эта функция даст мне больше деталей)
Решение
Я столкнулся с той же проблемой, на самом деле есть некоторые скрытые символы, невидимые, и вам нужно удалить его.
Вот глобальный код, который работает во многих случаях:
Другие решения
Удаление BOM (Byte Order Mark) часто является решением, которое вам нужно:
У вас не должно быть спецификации, но если она есть, она невидима, поэтому вы ее не увидите !!
использование BOM Cleaner если у вас есть много файлов, чтобы исправить.
Я решил эту проблему, добавив stripslashes в строку, перед json_decode.
Чтобы собрать все вместе, я подготовил JSON-оболочку с расшифровкой автокорректирующих действий. Самую последнюю версию можно найти в моем GitHub Gist .
Вы не показывали свой JSON, но это похоже на то, что это может быть неверная последовательность UTF-8 в аргументе, большинство онлайн-валидаторов не поймают его.
убедитесь, что ваши данные UTF-8, а также проверьте, есть ли у вас иностранные символы.
Вам не нужен PHP5, чтобы увидеть вашу ошибку, используйте журнал ошибок() регистрировать проблемы.
Попробовав все решение без результата, это сработало для меня.
Надеюсь, это поможет кому-то
У меня была такая же проблема. Для меня это было вызвано echo »
В начале файла я объявил тег разрыва строки … Так что это была ошибка для меня. Удалив этот тег разрыва строки, я смог […]
Источник
Bitrix: JSON error: Syntax error
При настройке сайта, пункт «Рабочий стол — Маркетинг — Поисковая оптимизация — Поисковые системы — Яндекс» при попытке авторизоваться через Яндекс и вводе полученного от Яндекс кода подтверждения получаю «Не удалось получить авторизацию: JSON error: Syntax error [4]». Причем данная ошибка видна только в Mozilla Firefox, в других браузерах просто не происходит авторизации. Битрикс установлен в виртуальной машине от разработчика (Bitrix virtual appliance version 7.4.3).
Обратился в ТП битрикса, неделю переписывался, попросили доступы не только в админку сайта но и доступы к аккаунту Яндекса (зачем?). После недельной переписки с ТП выяснилось, что есть проблема с подключением к сайту именно Яндекса.
Проверить проблему подключения к «oauth.yandex.ru» можно кодом:
$res = stream_socket_client(«ssl://oauth.yandex.ru:443», $errno, $errstr, 5);
var_dump($res);
И проблема была из-за того, что виртуалка была создана на CentOS 6.10, в которой для корректной работы с сервисами Яндекса необходимо принудительно обновить CA.
Делается следующим образом:
На всякий случай скопировали текущие CA (могут быть по другому пути):
cp /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem tls-ca-bundle.pem
Скачали новые и обновили CA.
curl https://www.certum.pl/CA.pem > /etc/pki/ca-trust/source/anchors/certum_pl_CA.pem
update-ca-trust extract
После этого вышеприведенный код перестал выдавать ошибку при подключении к сайту Яндекса.
Источник
json error syntax error 4
У меня очень странная проблема.
У меня есть веб-сервис JSON.
Но когда я загружаю свой JSON с этим кодом:
Я получил ошибку: SYNTAX ERROR
ЧТО НЕ ПОМОГАЕТ ПОЛНОЙ ВСЕ.
(но мне пока не удалось установить PHP 5.5, и я не уверен, что эта функция даст мне больше деталей)
Решение
Я столкнулся с той же проблемой, на самом деле есть некоторые скрытые символы, невидимые, и вам нужно удалить его.
Вот глобальный код, который работает во многих случаях:
Другие решения
Удаление BOM (Byte Order Mark) часто является решением, которое вам нужно:
У вас не должно быть спецификации, но если она есть, она невидима, поэтому вы ее не увидите !!
использование BOM Cleaner если у вас есть много файлов, чтобы исправить.
Я решил эту проблему, добавив stripslashes в строку, перед json_decode.
Чтобы собрать все вместе, я подготовил JSON-оболочку с расшифровкой автокорректирующих действий. Самую последнюю версию можно найти в моем GitHub Gist .
Вы не показывали свой JSON, но это похоже на то, что это может быть неверная последовательность UTF-8 в аргументе, большинство онлайн-валидаторов не поймают его.
убедитесь, что ваши данные UTF-8, а также проверьте, есть ли у вас иностранные символы.
Вам не нужен PHP5, чтобы увидеть вашу ошибку, используйте журнал ошибок() регистрировать проблемы.
Попробовав все решение без результата, это сработало для меня.
Надеюсь, это поможет кому-то
У меня была такая же проблема. Для меня это было вызвано echo »
В начале файла я объявил тег разрыва строки … Так что это была ошибка для меня. Удалив этот тег разрыва строки, я смог […]
(PHP 5 >= 5.3.0, PHP 7)
json_last_error — Возвращает последнюю ошибку
Описание
Возвращает последнюю ошибку (если она есть), произошедшую во время последнего кодирования/декодирования JSON если при вызове не использовался флаг JSON_THROW_ON_ERROR .
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает целочисленное значение, которое может быть одной из следующих констант:
Коды ошибок JSON
Константа | Значение | Доступность |
---|---|---|
JSON_ERROR_NONE | Ошибок нет | |
JSON_ERROR_DEPTH | Достигнута максимальная глубина стека | |
JSON_ERROR_STATE_MISMATCH | Неверный или некорректный JSON | |
JSON_ERROR_CTRL_CHAR | Ошибка управляющего символа, возможно неверная кодировка | |
JSON_ERROR_SYNTAX | Синтаксическая ошибка | |
JSON_ERROR_UTF8 | Некорректные символы UTF-8, возможно неверная кодировка | PHP 5.3.3 |
JSON_ERROR_RECURSION | Одна или несколько зацикленных ссылок в кодируемом значении | PHP 5.5.0 |
JSON_ERROR_INF_OR_NAN | Одно или несколько значений NAN или INF в кодируемом значении | PHP 5.5.0 |
JSON_ERROR_UNSUPPORTED_TYPE | Передано значение с неподдерживаемым типом | PHP 5.5.0 |
JSON_ERROR_INVALID_PROPERTY_NAME | Имя свойства не может быть закодировано | PHP 7.0.0 |
JSON_ERROR_UTF16 | Некорректный символ UTF-16, возможно некорректно закодирован | PHP 7.0.0 |
Примеры
Пример #1 Пример использования json_last_error()
// Неверная json-строка, которая вызовет синтаксическую ошибку,
// здесь в качестве кавычек мы используем ‘ вместо »
$json [] = « » ;
foreach ( $json as $string )
Результат выполнения данного примера:
Пример #2 Совместное использование json_last_error() и json_encode()
// Некорректная последовательность UTF8
$text = «xB1x31» ;
$json = json_encode ( $text );
$error = json_last_error ();
var_dump ( $json , $error === JSON_ERROR_UTF8 );
?>
Результат выполнения данного примера:
Пример #3 json_last_error() и JSON_THROW_ON_ERROR
// Некорректная последовательность UTF8, вызывающая JSON_ERROR_UTF8
json_encode ( «xB1x31» );
// Не вызовет ошибки JSON
json_encode ( ‘okay’ , JSON_THROW_ON_ERROR );
// Глобальное состояние не будет изменено json_encode()
var_dump ( json_last_error () === JSON_ERROR_UTF8 );
?>
Результат выполнения данного примера:
Смотрите также
- json_last_error_msg() — Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()
- json_decode() — Декодирует строку JSON
- json_encode() — Возвращает JSON-представление данных
I had previously asked the same question. I would like to decode the json from: http://pad.skyozora.com/data/pets.json. Below is the code I used previously:
From the last answer I know there is UTF8 DOM in the json return. I tried the answer from a similar question: json_decode returns NULL after webservice call, but all of the answers not work for me.
And after do more research I found a way that works:
This successfully decode the json into array. However all Chinese and Japanese character string were removed too. Any ideas?
Edited:
and give me the error:
But I couldn’t see any problem with this part of json.
Источник
json_last_error
(PHP 5 >= 5.3.0, PHP 7, PHP
json_last_error — Возвращает последнюю ошибку
Описание
Возвращает последнюю ошибку (если она есть), произошедшую во время последнего кодирования/декодирования JSON если при вызове не использовался флаг JSON_THROW_ON_ERROR .
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает целочисленное значение, которое может быть одной из следующих констант:
Коды ошибок JSON
Константа | Значение | Доступность |
---|---|---|
JSON_ERROR_NONE | Ошибок нет | |
JSON_ERROR_DEPTH | Достигнута максимальная глубина стека | |
JSON_ERROR_STATE_MISMATCH | Неверный или некорректный JSON | |
JSON_ERROR_CTRL_CHAR | Ошибка управляющего символа, возможно неверная кодировка | |
JSON_ERROR_SYNTAX | Синтаксическая ошибка | |
JSON_ERROR_UTF8 | Некорректные символы UTF-8, возможно неверная кодировка | |
JSON_ERROR_RECURSION | Одна или несколько зацикленных ссылок в кодируемом значении | |
JSON_ERROR_INF_OR_NAN | Одно или несколько значений NAN или INF в кодируемом значении | |
JSON_ERROR_UNSUPPORTED_TYPE | Передано значение с неподдерживаемым типом | |
JSON_ERROR_INVALID_PROPERTY_NAME | Имя свойства не может быть закодировано | |
JSON_ERROR_UTF16 | Некорректный символ UTF-16, возможно некорректно закодирован |
Примеры
Пример #1 Пример использования json_last_error()
// Неверная json-строка, которая вызовет синтаксическую ошибку,
// здесь в качестве кавычек мы используем ‘ вместо »
$json [] = «<‘Organization’: ‘PHP Documentation Team’>» ;
foreach ( $json as $string ) <
echo ‘Декодируем: ‘ . $string ;
json_decode ( $string );
switch ( json_last_error ()) <
case JSON_ERROR_NONE :
echo ‘ — Ошибок нет’ ;
break;
case JSON_ERROR_DEPTH :
echo ‘ — Достигнута максимальная глубина стека’ ;
break;
case JSON_ERROR_STATE_MISMATCH :
echo ‘ — Некорректные разряды или несоответствие режимов’ ;
break;
case JSON_ERROR_CTRL_CHAR :
echo ‘ — Некорректный управляющий символ’ ;
break;
case JSON_ERROR_SYNTAX :
echo ‘ — Синтаксическая ошибка, некорректный JSON’ ;
break;
case JSON_ERROR_UTF8 :
echo ‘ — Некорректные символы UTF-8, возможно неверно закодирован’ ;
break;
default:
echo ‘ — Неизвестная ошибка’ ;
break;
>
Результат выполнения данного примера:
Пример #2 Совместное использование json_last_error() и json_encode()
// Некорректная последовательность UTF8
$text = «xB1x31» ;
$json = json_encode ( $text );
$error = json_last_error ();
var_dump ( $json , $error === JSON_ERROR_UTF8 );
?>
Результат выполнения данного примера:
Пример #3 json_last_error() и JSON_THROW_ON_ERROR
// Некорректная последовательность UTF8, вызывающая JSON_ERROR_UTF8
json_encode ( «xB1x31» );
// Не вызовет ошибки JSON
json_encode ( ‘okay’ , JSON_THROW_ON_ERROR );
// Глобальное состояние не будет изменено json_encode()
var_dump ( json_last_error () === JSON_ERROR_UTF8 );
?>
Результат выполнения данного примера:
Смотрите также
- json_last_error_msg() — Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()
- json_decode() — Декодирует строку JSON
- json_encode() — Возвращает JSON-представление данных
Источник
Предопределённые константы
Перечисленные ниже константы определены данным модулем и могут быть доступны только в том случае, если PHP был собран с поддержкой этого модуля или же в том случае, если данный модуль был динамически загружен во время выполнения.
Следующие константы указывают на тип ошибки, возвращённой функцией json_last_error() или хранящейся, как code в JsonException .
JSON_ERROR_NONE ( int ) Не произошло никаких ошибок. JSON_ERROR_DEPTH ( int ) Была превышена максимальная глубина стека. JSON_ERROR_STATE_MISMATCH ( int ) Неверный или повреждённый JSON. JSON_ERROR_CTRL_CHAR ( int ) Ошибка управляющих символов, вероятно, из-за неверного кодирования. JSON_ERROR_SYNTAX ( int ) Синтаксическая ошибка. JSON_ERROR_UTF8 ( int ) Повреждённые символы UTF-8, вероятно, из-за неверного кодирования. JSON_ERROR_RECURSION ( int ) Объект или массив, переданный в функцию json_encode() включает рекурсивные ссылки и не может быть закодирован. Если была передана опция JSON_PARTIAL_OUTPUT_ON_ERROR , то на месте рекурсивных ссылок будет выведен null . JSON_ERROR_INF_OR_NAN ( int ) Значение, переданное в функцию json_encode() , включает либо NAN , либо INF . Если была указана константа JSON_PARTIAL_OUTPUT_ON_ERROR , то вместо указанных особых значений будет выведен 0 . JSON_ERROR_UNSUPPORTED_TYPE ( int ) В функцию json_encode() было передано значение неподдерживаемого типа, например, resource. Если была указана константа JSON_PARTIAL_OUTPUT_ON_ERROR , то вместо неподдерживаемого значения будет выводиться null . JSON_ERROR_INVALID_PROPERTY_NAME ( int ) В строке переданной в json_decode() был ключ, начинающийся с символа u0000. JSON_ERROR_UTF16 ( int ) Один непарный суррогат UTF-16 в экранированной последовательности Unicode в строке JSON, переданной в json_decode() .
Можно комбинировать следующие константы для передачи в json_decode() .
JSON_BIGINT_AS_STRING ( int ) Декодирует большие целые числа в качестве исходного значения строки. JSON_OBJECT_AS_ARRAY ( int ) Преобразует объекты JSON в массив PHP. Эта опция может быть задана автоматически, если вызвать json_decode() указав вторым параметром true .
Следующие константы можно комбинировать для использования в json_encode() .
JSON_HEX_TAG ( int ) Все кодируются в u003C и u003E. JSON_HEX_AMP ( int ) Все & кодируются в u0026. JSON_HEX_APOS ( int ) Все символы ‘ кодируются в u0027. JSON_HEX_QUOT ( int ) Все символы » кодируются в u0022. JSON_FORCE_OBJECT ( int ) Выдавать объект вместо массива при использовании неассоциативного массива. Это полезно, когда принимающая программа или код ожидают объект, а массив пуст. JSON_NUMERIC_CHECK ( int ) Кодирование строк, содержащих числа, как числа. JSON_PRETTY_PRINT ( int ) Использовать пробельные символы в возвращаемых данных для их форматирования. JSON_UNESCAPED_SLASHES ( int ) Не экранировать / . JSON_UNESCAPED_UNICODE ( int ) Не кодировать многобайтовые символы Unicode (по умолчанию они кодируются как uXXXX). JSON_PARTIAL_OUTPUT_ON_ERROR ( int ) Позволяет избежать возникновения ошибок при использовании функции json_encode. Осуществляет подстановку значений по умолчанию вместо некодируемых. JSON_PRESERVE_ZERO_FRACTION ( int ) Гарантирует, что значение типа float будет преобразовано именно в значение типа float в случае, если дробная часть равна 0. JSON_UNESCAPED_LINE_TERMINATORS ( int ) Символы конца строки не будут экранироваться, если задана константа JSON_UNESCAPED_UNICODE . Поведение будет таким же, какое оно было до PHP 7.1 без этой константы. Доступно с PHP 7.1.0.
Следующие константы можно комбинировать для использования в json_decode() и json_encode() .
JSON_INVALID_UTF8_IGNORE ( int ) Игнорировать некорректные символы UTF-8. Доступно с PHP 7.2.0. JSON_INVALID_UTF8_SUBSTITUTE ( int ) Преобразовывать некорректные символы UTF-8 в xfffd (Символ Юникода ‘REPLACEMENT CHARACTER’) Доступно с PHP 7.2.0. JSON_THROW_ON_ERROR ( int ) Выбрасывается исключение JsonException в случае возникновения ошибок вместо установки глобального состояния ошибки, которое может быть получено с помощью функции json_last_error() и json_last_error_msg() . Константа JSON_PARTIAL_OUTPUT_ON_ERROR имеет приоритет над JSON_THROW_ON_ERROR . Доступно с PHP 7.3.0.
Источник
Не открываются пользовательские группы после обновления (проблема с кодировкой)
Пользователь 4606427 Заглянувший Сообщений: 3 |
#1 22.06.2022 21:45:46 После последних обновлений портала (коробка), не отображаются содержимое пользовательских групп. При открытии любой группы (даже созданную только что) получаю такое: Часть лога /var/log/php/exceptions.log
|
||
Пользователь 5224375 Заглянувший Сообщений: 3 |
#2 23.06.2022 11:25:40 Та же самая проблема, перестали работать гриппы и проекты, причем если локализацию изменить на [ru] с [ua] все работает:
———- |
||
Пользователь 4490686 Заглянувший Сообщений: 3 |
#3 05.07.2022 10:29:51 Та же проблема с кодировкой.
Как решить? (она появилась после обновления bitrix) |
||
Пользователь 4490686 Заглянувший Сообщений: 3 |
#4 05.07.2022 14:10:04 Проблема с кодировкой . Бывает появляется после обновления сайта. https://www.1c-bitrix.ru/download/files/scripts/convert_utf8.php (если сайт на utf8 был) . https://dev.1c-bitrix.ru/community/blogs/howto/1466.php |
Jasta 980 / 501 / 103 Регистрация: 20.02.2016 Сообщений: 2,852 |
||||
1 |
||||
30.09.2021, 17:44. Показов 1906. Ответов 2 Метки нет (Все метки)
Доброго всем времени суток! После обновления Битрикса до версии 21.400.300 при отправке ajax запроса получаю ошибку json_failure. Для отправки запроса используется метод BX.ajax.runComponentAction:
Подскажите в чём может быть дело?!??
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
30.09.2021, 17:44 |
2 |
1823 / 1088 / 221 Регистрация: 16.03.2008 Сообщений: 5,110 Записей в блоге: 2 |
|
30.09.2021, 20:46 |
2 |
РешениеТак посмотрите в инструментах разработчика браузера что возвращается на запрос. Наверняка, если в .settings.php включите режим отладки — ошибка какая то выскочит. Если компонент citfact:lk.company_page на поддержке — может есть смысл обратиться к разработчику. 100% дело в этом компоненте
0 |
980 / 501 / 103 Регистрация: 20.02.2016 Сообщений: 2,852 |
|
01.10.2021, 16:24 [ТС] |
3 |
100% дело в этом компоненте Да Вы были правы. Стал ковырять компонент и оказалось что дауны которые разрабатывали этот сайт до меня, отдавали с бека компонент целиком, чтобы потом перерисовать его через JS, но уже с крохотным сообщением об успехе. Удалил всю эту дичь и переписал по человечески. Спасибо за помощь))
0 |
Открытые статические члены |
|
static | encode ($data, $options=null) |
static | decode ($data) |
Защищенные статические члены |
|
static | serializeJson (&$data) |
static | convertData ($data) |
static | unConvertData ($data) |
static | checkException ($options=0) |
static | throwException ($e) |
См. определение в файле json.php строка 10
◆ checkException()
|
staticprotected |
Checks global error flag and raises exception if needed.
- Аргументы
-
integer $options Bitmasked options. When JSON_PARTIAL_OUTPUT_ON_ERROR passed no exception is raised.
- Возвращает
- void
- Исключения
См. определение в файле json.php строка 129
130 {
131 $e = json_last_error();
132
133 if ($e == JSON_ERROR_NONE)
134 {
135 return;
136 }
137
138 if ($e == JSON_ERROR_UTF8 && ($options & JSON_PARTIAL_OUTPUT_ON_ERROR))
139 {
140 return;
141 }
142
143 $message = sprintf(‘%s [%d]’, json_last_error_msg(), $e);
145 }
static throwException($e)
◆ convertData()
|
staticprotected |
Converts $data to UTF-8 charset.
- Аргументы
- Возвращает
- mixed
См. определение в файле json.php строка 101
102 {
104
105 return Encoding::convertEncoding($data, $culture->getCharset(), ‘UTF-8’);
106 }
◆ decode()
|
static |
Takes a JSON encoded string and converts it into a PHP variable.
- Аргументы
-
string $data The json string being decoded.
- Возвращает
- mixed
- Исключения
- См. также
- json_decode
См. определение в файле json.php строка 53
54 {
55 $res = json_decode($data, true);
56
58
59
60 if($res === null && strtolower($data) != ‘null’)
61 {
63 }
64
66 {
68 }
69
70 return $res;
71 }
static checkException($options=0)
static unConvertData($data)
◆ encode()
|
static |
Returns a string containing the JSON representation of $data.
- Аргументы
-
mixed $data The value being encoded. null $options Bitmasked options. Default is JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS|JSON_HEX_QUOT.
- Возвращает
- mixed
- Исключения
- См. также
- json_encode
Переопределяется в YandexJson.
См. определение в файле json.php строка 24
25 {
27 {
30 }
31
32 if (is_null($options))
33 {
34 $options = JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS|JSON_HEX_QUOT;
35 }
36
37 $res = json_encode($data, $options);
38
40
41 return $res;
42 }
static serializeJson(&$data)
static convertData($data)
◆ serializeJson()
|
staticprotected |
Executes serializeJson on JsonSerializable objects for non-UTF8 instances. We have to do it manually to prevent «malformed UTF-8 characters» error.
- Аргументы
См. определение в файле json.php строка 79
80 {
81 if($data instanceof JsonSerializable)
82 {
83 $data = $data->jsonSerialize();
84 }
85
86 if (is_iterable($data))
87 {
88 foreach ($data as $key => $value)
89 {
91 }
92 }
93 }
◆ throwException()
|
staticprotected |
Throws exception with message given.
- Аргументы
-
string $e Exception message.
- Возвращает
- void
- Исключения
См. определение в файле json.php строка 155
156 {
157 throw new ArgumentException(‘JSON error: ‘.$e, ‘data’);
158 }
◆ unConvertData()
|
staticprotected |
Converts $data from UTF-8 charset.
- Аргументы
- Возвращает
- mixed
См. определение в файле json.php строка 114
115 {
117
118 return Encoding::convertEncoding($data, ‘UTF-8’, $culture->getCharset());
119 }
◆ JSON_ERROR_UNKNOWN
const JSON_ERROR_UNKNOWN = -1
См. определение в файле json.php строка 12
Объявления и описания членов класса находятся в файле:
- C:/Bitrix/modules/main/lib/web/json.php
Контроллеры — это часть MVC архитектуры, которая отвечает за обработку запроса и генерирование ответа. Сразу оговоримся, что дальше речь пойдет про компоненты-контроллеры в контексте Bitrix Framework.
Битрикс-контроллер принимает от клиента запрос и возвращает JSON с результатом или ошибкой. Классы-контроллеры содержат одно или несколько методов-действий и являются надстройкой над обычными компонентами, поэтому их нужно размещать в файле class.php
компонента.
Бекенд
Тут все просто: в компоненте нужно реализовать интерфейс Controllerable
, в ктором есть метод configureActions()
. Этот метод возвращает массив с действиями которые можно вызвать. Например, для действия send
нужно будет создать метод sendAction
.
Метод-действие возвращает массив, который затем отдается клиенту в виде JSON.
Если требуется отдавать на сторону клиента ошибки, то нужно реализовать интерфейс Errorable
, в котором есть методы getErrors()
и getErrorByCode()
. Также нужно будет реализовать коллекцию ошибок ErrorCollection
, ее удобнее всего создать в методе onPrepareComponentParams()
.
В качестве простого примера создадим контроллер для формы обратной связи. Компонент пусть называется machaon:feedback
, код контроллера разместится в файле /local/components/machaon/feedback/class.php
.
<?php
//local/components/machaon/feedback/class.php
namespace MachaonComponents;
use BitrixMainError;
use BitrixMainErrorable;
use BitrixMainErrorCollection;
use BitrixMainEngineActionFilter;
use BitrixMainEngineContractControllerable;
use CBitrixComponent;
class FeedbackComponent extends CBitrixComponent implements Controllerable, Errorable
{
protected ErrorCollection $errorCollection;
public function onPrepareComponentParams($arParams)
{
$this->errorCollection = new ErrorCollection();
return $arParams;
}
public function executeComponent()
{
// Метод не будет вызван при ajax запросе
}
public function getErrors(): array
{
return $this->errorCollection->toArray();
}
public function getErrorByCode($code): Error
{
return $this->errorCollection->getErrorByCode($code);
}
// Описываем действия
public function configureActions(): array
{
return [
'send' => [
'prefilters' => [
// здесь указываются опциональные фильтры, например:
new ActionFilterAuthentication(), // проверяет авторизован ли пользователь
]
]
];
}
// Сюда передаются параметры из ajax запроса, навания точно такие же как и при отправке запроса.
// $_REQUEST['username'] будет передан в $username, $_REQUEST['email'] будет передан в $email и т.д.
public function sendAction(string $username = '', string $email = '', string $message = ''): array
{
try {
$this->doSomeWork();
return [
"result" => "Ваше сообщение принято",
];
} catch (ExceptionsEmptyEmail $e) {
$this->errorCollection[] = new Error($e->getMessage());
return [
"result" => "Произошла ошибка",
];
}
}
}
Фронтенд
В js-библиотеке Битрикс уже есть функция для отправки запросов. Далее простой пример, где machaon:feedback
это имя компонента, send
— имя действия, а в data: {}
передаются необходимые данные:
BX.ajax.runComponentAction("machaon:feedback", "send", {
mode: "class",
data: {
"email": "vasya@email.tld",
"username": "Василий",
"message": "Где мой заказ? Жду уже целый час!"
}
}).then(function (response) {
// обработка ответа
});
Если все хорошо, с бэкенда нам вернется:
{
"status": "success",
"data": {
"result": "Письмо отправлено"
},
"errors": []
}
Либо сообщение об ошибке:
{
"status": "error",
"data": {
"result": "Произошла ошибка"
},
"errors": [{
"message": "Не заполено поле Email",
"code": 0,
"customData": null
}]
}
Отправка запроса напрямую
Если не хочется использовать BX.ajax.runComponentAction()
, можно отправить запрос напрямую, например используя jQuery. Нужно отправить запрос на /bitrix/services/main/ajax.php
, он будет выглядеть примерно так:
$.post(
"/bitrix/services/main/ajax.php?mode=class&c=machaon:feedback&action=send",
{
"email": "vasya@email.tld",
"username": "Василий",
"message": "Где мой заказ? Жду уже целый час!"
},
function (response) {
console.log(response);
}
);
В параметре mode
передается обязательное значение class
, в c
передается имя компонента в формате vendor:component
, action
это запускаемый метод.
Эти параметры обязательно должны передаваться в адресе запроса, иначе происходит ошибка.
email
, username
и message
станут затем параметрами $email
, $username
и $message
в методе sendAction()
.
Использование ЧПУ
Также можно в urlrewrite.php
прописать красивый адрес, например /api/rest-component/<component_vendor>/<component_name>/<action>/
.
Для этого добавим в urlrewrite.php
следующий массив:
$arUrlRewrite = [
// ...
[
"CONDITION" => "#^/api/rest-component/([a-zA-Z0-9]+)/([a-zA-Z0-9.]+)/([a-zA-Z0-9]+)/?.*#",
"RULE" => "mode=class&c=$1:$2&action=$3",
"PATH" => "/bitrix/services/main/ajax.php",
],
];
Тогда запрос будет выглядеть понятнее:
function sendFeedback(form) {
const route = "/api/rest-component/machaon/feedback/send/";
const data = $(form).serialize();
$.post(route, data, function (response) {
console.log(response);
});
}
Нюансы
Если в configureActions()
оставить пустой массив prefilters
, то метод-действие будет работать без фильтров.
Но если не указывать ключ prefilters
, то будут применены фильтры по умолчанию — ActionFilterAuthentication
и ActionFilterCsrf
.
public function configureActions(): array
{
return [
'send' => [
'prefilters' => [] // метод sendAction() будет работать без фильтров
]
];
}
public function configureActions(): array
{
return [
'send' => [] // метод sendAction() будет работать у авторизованных пользователей, которые передали CSRF-токен
];
}
Пример ошибки когда пользователь не авторизован и не передал токен:
{
"status": "error",
"data": null,
"errors": [
{
"message": "Необходимо авторизоваться на сайте",
"code": "invalid_authentication",
"customData": null
},
{
"message": "Invalid csrf token",
"code": "invalid_csrf",
"customData": {
"csrf": "dc8adda3ac983217623cf1196dfc5c61"
}
}
]
}
Если требуется CSRF-защита, то для фильтра BitrixMainEngineActionFilterCsrf
нужно передать идентификатор сессии в параметре sessid
.
На бэкенде его можно получить функцией bitrix_sessid()
, на фронтенде — BX.bitrix_sessid()
.
При использовании BX.ajax.runComponentAction()
сессия передается автоматически.
Другие фильтры можно посмотреть в документации
У меня очень странная проблема.
У меня есть веб-сервис JSON.
Когда я проверяю это на этом сайте http://www.freeformatter.com/json-formatter.html#ad-output
Все отлично.
Но когда я загружаю свой JSON с этим кодом:
$data = file_get_contents('http://www.mywebservice');
if(!empty($data))
{
$obj = json_decode($data);
switch (json_last_error()) {
case JSON_ERROR_NONE:
echo ' - JSON_ERROR_NONE';
break;
case JSON_ERROR_DEPTH:
echo ' - JSON_ERROR_DEPTH';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - JSON_ERROR_STATE_MISMATCH';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - JSON_ERROR_CTRL_CHAR';
break;
case JSON_ERROR_SYNTAX:
echo "rnrn - SYNTAX ERROR rnrn";
break;
case JSON_ERROR_UTF8:
echo ' - JSON_ERROR_UTF8';
break;
default:
echo ' - Unknown erro';
break;
}
Я получил ошибку: SYNTAX ERROR
ЧТО НЕ ПОМОГАЕТ ПОЛНОЙ ВСЕ.
Это кошмар.
Я вижу, что с PHP 5.5 я мог бы использовать эту функцию: http://php.net/manual/en/function.json-last-error-msg.php
(но мне пока не удалось установить PHP 5.5, и я не уверен, что эта функция даст мне больше деталей)
26
Решение
Я столкнулся с той же проблемой, на самом деле есть некоторые скрытые символы, невидимые, и вам нужно удалить его.
Вот глобальный код, который работает во многих случаях:
<?php
$checkLogin = file_get_contents("http://yourwebsite.com/JsonData");
// This will remove unwanted characters.
// Check http://www.php.net/chr for details
for ($i = 0; $i <= 31; ++$i) {
$checkLogin = str_replace(chr($i), "", $checkLogin);
}
$checkLogin = str_replace(chr(127), "", $checkLogin);
// This is the most common part
// Some file begins with 'efbbbf' to mark the beginning of the file. (binary level)
// here we detect it and we remove it, basically it's the first 3 characters
if (0 === strpos(bin2hex($checkLogin), 'efbbbf')) {
$checkLogin = substr($checkLogin, 3);
}
$checkLogin = json_decode( $checkLogin );
print_r($checkLogin);
?>
64
Другие решения
Удаление BOM
(Byte Order Mark) часто является решением, которое вам нужно:
function removeBOM($data) {
if (0 === strpos(bin2hex($data), 'efbbbf')) {
return substr($data, 3);
}
return $data;
}
У вас не должно быть спецификации, но если она есть, она невидима, поэтому вы ее не увидите !!
увидеть W3C в спецификации в HTML
использование BOM Cleaner если у вас есть много файлов, чтобы исправить.
38
Я решил эту проблему, добавив stripslashes в строку, перед json_decode.
$data = stripslashes($data);
$obj = json_decode($data);
22
Чтобы собрать все вместе, я подготовил JSON-оболочку с расшифровкой автокорректирующих действий. Самую последнюю версию можно найти в моем GitHub Gist.
abstract class Json
{
public static function getLastError($asString = FALSE)
{
$lastError = json_last_error();
if (!$asString) return $lastError;
// Define the errors.
$constants = get_defined_constants(TRUE);
$errorStrings = array();
foreach ($constants["json"] as $name => $value)
if (!strncmp($name, "JSON_ERROR_", 11))
$errorStrings[$value] = $name;
return isset($errorStrings[$lastError]) ? $errorStrings[$lastError] : FALSE;
}
public static function getLastErrorMessage()
{
return json_last_error_msg();
}
public static function clean($jsonString)
{
if (!is_string($jsonString) || !$jsonString) return '';
// Remove unsupported characters
// Check http://www.php.net/chr for details
for ($i = 0; $i <= 31; ++$i)
$jsonString = str_replace(chr($i), "", $jsonString);
$jsonString = str_replace(chr(127), "", $jsonString);
// Remove the BOM (Byte Order Mark)
// It's the most common that some file begins with 'efbbbf' to mark the beginning of the file. (binary level)
// Here we detect it and we remove it, basically it's the first 3 characters.
if (0 === strpos(bin2hex($jsonString), 'efbbbf')) $jsonString = substr($jsonString, 3);
return $jsonString;
}
public static function encode($value, $options = 0, $depth = 512)
{
return json_encode($value, $options, $depth);
}
public static function decode($jsonString, $asArray = TRUE, $depth = 512, $options = JSON_BIGINT_AS_STRING)
{
if (!is_string($jsonString) || !$jsonString) return NULL;
$result = json_decode($jsonString, $asArray, $depth, $options);
if ($result === NULL)
switch (self::getLastError())
{
case JSON_ERROR_SYNTAX :
// Try to clean json string if syntax error occured
$jsonString = self::clean($jsonString);
$result = json_decode($jsonString, $asArray, $depth, $options);
break;
default:
// Unsupported error
}
return $result;
}
}
Пример использования:
$json_data = file_get_contents("test.json");
$array = Json::decode($json_data, TRUE);
var_dump($array);
echo "Last error (" , Json::getLastError() , "): ", Json::getLastError(TRUE), PHP_EOL;
6
Вы не показывали свой JSON, но это похоже на то, что это может быть неверная последовательность UTF-8 в аргументе, большинство онлайн-валидаторов не поймают его.
убедитесь, что ваши данные UTF-8, а также проверьте, есть ли у вас иностранные символы.
Вам не нужен PHP5, чтобы увидеть вашу ошибку, используйте журнал ошибок() регистрировать проблемы.
1
Попробовав все решение без результата, это сработало для меня.
Надеюсь, это поможет кому-то
$data = str_replace('"', '"', $data);
0
У меня была такая же проблема. Для меня это было вызвано echo "<br/><pre>"
, Я пытался передать строку JSON в другой файл PHP с помощью exit(json_encode(utf8ize($resp_array)));
В начале файла я объявил линия разрыва тег … Так что это была ошибка для меня. Удаление этого разрыв строки тега , Я был в состоянии расшифровать мою строку JSON другой файл PHP ..
-1
У меня была такая же проблема. Для меня это было вызвано echo "<br/><pre>"
,
Я пытался передать строку JSON в другой файл PHP с помощью:
exit(json_encode(utf8ize($resp_array)));
В начале файла я объявил тег разрыва строки … Так что это была ошибка для меня. Удалив этот тег разрыва строки, я смог […]
-1