不工作:
$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);
答案 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
不起作用,请确保用短绒棉纸验证您的字符串。