web-dev-qa-db-fra.com

PHP: json_decode ne fonctionne pas

Ceci ne pas fonctionne:

$jsonDecode = json_decode($jsonData, TRUE);

Cependant, si je copie la chaîne à partir de $jsonData et que je la mets manuellement dans la fonction de décodage, cela fonctionne.

Ce fonctionne :

$jsonDecode = json_decode('{"id":"0","bid":"918","url":"http:\/\/www.google.com","md5":"6361fbfbee69f444c394f3d2fa062f79","time":"2014-06-02 14:20:21"}', TRUE);

J'ai sorti $jsonData copié et mis comme ci-dessus dans la fonction de décodage. Ensuite cela a fonctionné. Cependant, si je mets $jsonData directement dans la fonction de décodage, ce n'est pas le cas.

var_dump($jsonData) montre:

string(144) "{"id":"0","bid":"918","url":"http:\/\/www.google.com","md5":"6361fbfbee69f444c394f3d2fa062f79","time":"2014-06-02 14:20:21"}"

Le $jsonData provient d'une variable $_GET cryptée. Pour le chiffrer, j'utilise ceci:

$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);
17
yoshi

Très probablement, vous devez retirer le rembourrage de vos données déchiffrées. Votre chaîne contient 124 caractères visibles, mais var_dump indique 144. Cela signifie que 20 caractères de remplissage doivent être supprimés (une série d'octets "\ 0" à la fin de votre chaîne).

Cela correspond probablement à 4 "\ 0" octets à la fin d'un bloc + un bloc vide de 16 octets (pour marquer la fin des données).

Comment décryptez-vous/chiffrez-vous actuellement votre chaîne?

Modifier :

Vous devez ajouter ceci pour couper les octets nuls à la fin de la chaîne:

$jsonData = rtrim($jsonData, "\0");
9
this.lau_

il y a quelque temps des entités HTML, par exemple\"cela va ressembler à ceci\& quot , vous devez donc analyser les entités html en texte réel, ce que vous pouvez utiliser avec. html_entity_decode () méthode de php. 

$jsonData = stripslashes(html_entity_decode($jsonData));

$k=json_decode($jsonData,true);

print_r($k);
43
user2987827

À en juger par les autres commentaires, vous pourriez utiliser,

$ jsonDecode = json_decode (trim ($ jsonData), TRUE);

5
dar7yl

Assurez-vous de définir l'en-tête sur JSON

header('Content-type: application/json;');
3
amrography

J'ai eu le problème que json_decode ne fonctionnait pas, la solution était de changer l'encodage de chaîne en utf-8. Ceci est important si vous avez des caractères non latins.

2
Mindaugas Dobilas

De manière intéressante, mcrypt_decrypt semble ajouter des caractères de contrôle autres que\0 à la fin du texte résultant en raison de son algorithme de remplissage. Par conséquent, au lieu de rtrim($jsonData, "\0")it, il est recommandé d’utiliser 

preg_replace( "/\p{Cc}*$/u", "", $data)

sur le résultat $ data de mcrypt_decrypt. json_decode fonctionnera si tous les caractères de contrôle de fin sont supprimés. Veuillez vous reporter au commentaire de Peter Bailey à http://php.net/manual/en/function.mdecrypt-generic.php .

1
Diwakar Padmaraja

En passant sur php 7.1, j'ai rencontré le numéro d'erreur 4 json_decode (erreur json syntex). Aucune des solutions ci-dessus sur cette page n'a fonctionné pour moi. 

Après avoir fait quelques recherches supplémentaires, j’ai trouvé la solution sur https://stackoverflow.com/a/15423899/1545384 et que cela fonctionne pour moi.

//Remove UTF8 Bom

function remove_utf8_bom($text)
{
    $bom = pack('H*','EFBBBF');
    $text = preg_replace("/^$bom/", '', $text);
    return $text;
}
1
Akhilesh Kumar

str_replace ( "\ t" , "", str_replace ( "\ n" , "", chaîne $))

parce que json_decode ne fonctionne pas avec des caractères spéciaux. Et aucune erreur ne sera affichée. Assurez-vous de bien supprimer les espaces de tabulation et les nouvelles lignes . Selon la source de vos données, vous aurez peut-être également besoin de: stripslashes (html_entity_decode ($ string)) 

Travaille pour moi:

<?php

$sql = <<<EOT

    SELECT *
        FROM `students`;

EOT;
    $string = '{ "query" : "' . str_replace("\t", " ", str_replace("\n", " ", $sql)).'" }';
    print_r(json_decode($string));

?>

sortie:

stdClass Object
(
    [query] =>          SELECT *      FROM `students`;     
)
1
profimedica