У меня очень странная проблема.
У меня есть веб-сервиса в формате 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 "\r\n\r\n - SYNTAX ERROR \r\n\r\n";
break;
case JSON_ERROR_UTF8:
echo ' - JSON_ERROR_UTF8';
break;
default:
echo ' - Unknown erro';
break;
}
Я получил ошибку : ошибка синтаксиса
КОТОРЫЙ НЕ ПОМОЖЕТ ВАМ НА ВСЕХ.
Это кошмар.
Я вижу, что с PHP 5.5 я могу использовать эту функцию : http://php.net/manual/en/function.json-last-error-msg.php
(но мне так и не удалось установить PHP 5.5, и я не уверен, что эта функция даст мне более подробно)
Я столкнулась с той же проблемой, на самом деле есть некоторые скрытые символы невидимого, и вы должны удалить его. Здесь's в глобальный код, который работает для многих случаях:
<?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);
?>
Удаление спецификации
(метка порядка байтов) часто-раз решение вам нужно:
function removeBOM($data) {
if (0 === strpos(bin2hex($data), 'efbbbf')) {
return substr($data, 3);
}
return $data;
}
Вы должны'т иметь спецификацию, но если это'ы есть, он невидим, так что вы выиграли'т вижу!!
см. W3C в спецификации на'ы в формате HTML
используйте чище спецификации Если у вас есть много'файлы исправить.
Я решил эту проблему добавив stripslashes в строку, прежде чем json_decode.
$data = stripslashes($data);
$obj = json_decode($data);
Положить все вместе здесь и там, я'ве подготовлены в формате JSON фантик с декодированием авто корректирующих действий. Самую последнюю версию можно найти в моем Гист на GitHub.
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;
После попытки все решения без результата это один работал для меня.
Надеюсь, это поможет кому-то
$data = str_replace('"', '"', $data);
пожалуйста, сначала очистить данные в JSON, а затем загрузить.
У меня такая же проблема, получая JSON_ERROR_CTRL_CHAR и JSON_ERROR_SYNTAX&.ЛТ;БР/> Это мое исправление.
$content = json_decode(json_encode($content), true);
Строку JSON должны быть в двойных кавычках, в JSON это'т является допустимым, поскольку вы не'т придется бежать '
характер.
char = unescaped /
escape (
%x22 / ; " quotation mark U+0022
%x5C / ; \ reverse solidus U+005C
%x2F / ; / solidus U+002F
%x62 / ; b backspace U+0008
%x66 / ; f form feed U+000C
%x6E / ; n line feed U+000A
%x72 / ; r carriage return U+000D
%x74 / ; t tab U+0009
%x75 4HEXDIG ) ; uXXXX U+XXXX
В '
не в списке.
Увидеть этот список специальных символов, используемых в JSON:
\b Backspace (ascii code 08)
\f Form feed (ascii code 0C)
\n New line
\r Carriage return
\t Tab
\" Double quote
\\ Backslash character
Проверьте это - сайт для получения дополнительной документации.
Вы еще'т показать свой JSON, но это звучит как это может быть недействительным UTF-8 последовательность в аргументации, в большинстве онлайн-валидатор не поймать его. убедитесь, что ваши данные в UTF-8, а также проверить, если у вас есть иностранные символы. Вы Don'т нужна РНР5, чтобы увидеть свои ошибки, используйте функцию error_log() в журнале проблем.
Одна проблема с моей стороны, что были некоторые неверные цифры, начиная с 0, например, на "001" В, С "002" В, С "003" по.
"expectedToBeReturned":1,
"inventoryNumber":001,
"remindNote":"",
Замените 001 с 1 и он работает.
Этот код работал для меня. В основном она удаляет скрытые символы.
function cleanString($val)
{
$non_displayables = array(
'/%0[0-8bcef]/', # url encoded 00-08, 11, 12, 14, 15
'/%1[0-9a-f]/', # url encoded 16-31
'/[\x00-\x08]/', # 00-08
'/\x0b/', # 11
'/\x0c/', # 12
'/[\x0e-\x1f]/', # 14-31
'/x7F/' # 127
);
foreach ($non_displayables as $regex)
{
$val = preg_replace($regex,'',$val);
}
$search = array("\0","\r","\x1a","\t");
return trim(str_replace($search,'',$val));
}
У меня были те же вопросы. Я взял следующие шаги:
$JSON с = utf8_encode($JSON с);
ï
$JSON с = как str_replace(массив('ï',''), '',$в JSON);
и я успешно расшифровал мой формат JSON
У меня был тот же вопрос. Для меня это вызывает на Эхо "<БР/><жестко>"
в.
Я пытаюсь передать строку JSON в другой файл php с использованием :
exit(json_encode(utf8ize($resp_array)));
В начале файла я decleared сломать теге линии... так что это было для меня ошибка. Устранение этого разрыва тег строки , я был в состоянии [...]
У меня был тот же вопрос. Для меня это вызывает на Эхо "<БР/><жестко>"
в. Я пытаюсь передать строку JSON в другой php файл, используя `выход(json_encode(utf8ize($resp_array))); в начале файла я decleared обрыв тег... так что это было для меня ошибка. Удаление этого разрыв строки тег , я был в состоянии расшифровывать мой формат JSON строку в другой файл php..