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-сущностей, например \", она будет выглядеть как \&quot, поэтому вам необходимо проанализировать 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.