PHP: json_decode не работает
Это работает не:
$jsonDecode = json_decode($jsonData, TRUE);
Однако, если я скопирую строку из $jsonData
и поместив ее внутри функции декодирования вручную, она будет работать.
Этот работает:
$jsonDecode = json_decode('{"id":"0","bid":"918","url":"http:\/\/www.google.com","md5":"6361fbfbee69f444c394f3d2fa062f79","time":"2014-06-02 14:20:21"}', TRUE);
Я сделал вывод $jsonData
, скопировал его и вставил, как указано выше, в функцию декодирования. Тогда это сработало. Однако, если я положил $jsonData
непосредственно в функцию декодирования, это не так.
var_dump($jsonData)
показывает:
string(144) "{"id":"0","bid":"918","url":"http:\/\/www.google.com","md5":"6361fbfbee69f444c394f3d2fa062f79","time":"2014-06-02 14:20:21"}"
$jsonData
происходит из зашифрованной переменной $_GET
. Чтобы зашифровать его, я использую это:
$key = "SOME KEY";
$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_ECB, $iv);
$iv = rawurlencode(base64_encode($iv));
$enc = rawurlencode(base64_encode($enc));
//To Decrypt
$iv = base64_decode(rawurldecode($_GET['i']));
$enc = base64_decode(rawurldecode($_GET['e']));
$data = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB, $iv);
Ответы
Ответ 1
Скорее всего, вам нужно отменить заполнение из ваших расшифрованных данных. В строке есть 124 видимых символа, но var_dump
сообщает 144. Это означает, что нужно удалить 20 символов заполнения (серия "\ 0" байт в конце вашей строки).
Вероятно, что 4 "\ 0" байт в конце блока + пустой 16-байтовый блок (чтобы пометить конец данных).
Как вы в настоящее время расшифровываете/шифруете свою строку?
Edit
Вам нужно добавить это, чтобы обрезать нулевые байты в конце строки:
$jsonData = rtrim($jsonData, "\0");
Ответ 2
некоторое время возникает проблема html-сущностей, например \", она будет выглядеть как \", поэтому вам необходимо проанализировать html-entites для реальный текст, который вы можете использовать
html_entity_decode()
метод php.
$jsonData = stripslashes(html_entity_decode($jsonData));
$k=json_decode($jsonData,true);
print_r($k);
Ответ 3
Судя по другим комментариям, вы можете использовать
$jsonDecode = json_decode (обрезка ($ jsonData), TRUE);
Ответ 4
Обязательно установите заголовок в JSON
header('Content-type: application/json;');
Ответ 5
str_replace ( "\ t" , ", str_replace (" \n "," ", $string))
потому что json_decode не работает со специальными символами. И никакая ошибка не будет отображаться. Убедитесь, что вы удалите области вкладок и новые строки.
В зависимости от источника вы получаете свои данные, вам может потребоваться также:
stripslashes (html_entity_decode ($ string))
Работает для меня:
<?php
$sql = <<<EOT
SELECT *
FROM `students`;
EOT;
$string = '{ "query" : "' . str_replace("\t", " ", str_replace("\n", " ", $sql)).'" }';
print_r(json_decode($string));
?>
выход:
stdClass Object
(
[query] => SELECT * FROM `students`;
)
Ответ 6
У меня возникла проблема с тем, что json_decode
не работал, решение заключалось в том, чтобы изменить строковое кодирование на utf-8. Это важно, если у вас есть нелатинские символы.
Ответ 7
Интересно, что mcrypt_decrypt, похоже, добавляет контрольные символы, отличные от \0, в конце полученного текста из-за его алгоритма заполнения. Поэтому вместо rtrim($jsonData, "\0")
рекомендуется использовать
preg_replace( "/\p{Cc}*$/u", "", $data)
на результат $данных mcrypt_decrypt. json_decode будет работать, если все конечные управляющие символы будут удалены. Pl ссылается на комментарий Питера Бэйли в http://php.net/manual/en/function.mdecrypt-generic.php.
Ответ 8
При переходе на php 7.1 я столкнулся с ошибкой json_decode № 4 (ошибка синтаксиса json). Ни одно из вышеуказанных решений на этой странице не сработало для меня.
После еще нескольких поисков я нашел решение по адресу fooobar.com/questions/5479/... и оно работает для меня.
//Remove UTF8 Bom
function remove_utf8_bom($text)
{
$bom = pack('H*','EFBBBF');
$text = preg_replace("/^$bom/", '', $text);
return $text;
}
Ответ 9
Вы должны использовать preg_replace, чтобы избежать нулевых результатов от json_decode
вот пример кода
$ json_string = stripslashes (html_entity_decode ($ json_string));
$ bookingdata = json_decode (preg_replace ('/[\ x00-\x1F\x80-\xFF]/', '', $ json_string), true);
Ответ 10
ИСПОЛЬЗУЙТЕ ЭТОТ КОД
<?php
$json = preg_replace('/[[:cntrl:]]/', '', $json_data);
$json_array = json_decode($json, true);
echo json_last_error();
echo json_last_error_msg();
print_r($json_array);
?>
Ответ 11
Убедитесь, что содержимое, которое вы хотите декодировать как JSON, действительно соответствует формату JSON.