PHP:json_decode无效

时间:2014-06-02 18:57:53

标签: php json

工作:

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

12 个答案:

答案 0 :(得分:45)

某段时间存在html实体问题,例如 \" 它将代表 \& quot ,因此您必须解析html引用真实文本,你可以使用  的 html_entity_decode()  php的方法。

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

$k=json_decode($jsonData,true);

print_r($k);

答案 1 :(得分:9)

您很可能需要从解密数据中删除填充。您的字符串中有124个可见字符,但var_dump报告144.这意味着需要删除20个填充字符(字符串末尾有一系列“\ 0”字节)。

可能是一个块末尾的4“\ 0”字节+一个空的16字节块(用于标记数据的结尾)。

您目前如何解密/加密字符串?

修改

你需要添加它来修剪字符串末尾的零字节:

$jsonData = rtrim($jsonData, "\0");

答案 2 :(得分:5)

从其他评论来看,你可以使用,

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

答案 3 :(得分:3)

务必将标题设置为JSON

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

答案 4 :(得分:2)

我遇到json_decode无效的问题,解决方法是将字符串编码更改为utf-8。如果你有非拉丁字符,这很重要。

答案 5 :(得分:1)

有趣的是,mcrypt_decrypt似乎在结果文本的末尾添加了除\ 0以外的控制字符,因为它的填充算法。因此,而不是rtrim($jsonData, "\0") 建议使用

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

关于mcrypt_decrypt的结果$数据。如果删除所有尾随控制字符,json_decode将起作用。 Pl参考Peter Bailey在http://php.net/manual/en/function.mdecrypt-generic.php的评论。

答案 6 :(得分:1)

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`;     
)

答案 7 :(得分:1)

在使用php 7.1时,我遇到了json_decode错误编号4(json syntex错误)。此页面上的上述解决方案均不适合我。

经过更多搜索后,我在https://stackoverflow.com/a/15423899/1545384找到了解决方案,它对我有用。

//Remove UTF8 Bom

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

答案 8 :(得分:0)

您必须使用preg_replace来避免json_decode的空结果

这是示例代码

$ json_string =斜杠(html_entity_decode($ json_string));

$ bookingdata = json_decode(preg_replace('/ [\ x00- \ x1F \ x80- \ xFF] /','',$ json_string),true);

答案 9 :(得分:0)

使用此代码

<?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);
?>

答案 10 :(得分:0)

使用以下功能:

如果发生JSON_ERROR_UTF8:

$url = 'http://learner.com/learningphp.php?lid=1348';
$file_name = basename(parse_url($url, PHP_URL_PATH));
echo $file_name;

以下功能用于递归编码数组数据

/ *将其用于json_encode一些损坏的UTF-8字符 *适用于=格式错误的utf-8字符,可能被json_encode错误编码 * /

$encoded = json_encode( utf_convert( $responseForJS ) );

答案 11 :(得分:0)

确保您的JSON实际上有效。由于某些原因,我确信这是有效的JSON:

{ type: "block" }

不是。要点是,如果发现json_decode不起作用,请确保用短绒棉纸验证您的字符串。