json_decode返回NULL,UTF-8 BOM

6

我想使用json_decode函数将JSON数据解码并存储到数组中,但它返回了NULL值。我认为这是因为UTF-8 BOM的原因。有什么解决办法吗? 我正在使用Windows7操作系统和xampp。 我将我的编码设置为

header('Content-type:application/json; charset=utf-8');

JSON 数据
{"command":"E101","user_id":"someuser","movie_id":"1","link_id":"2"}

JSON错误:控制字符错误,可能编码不正确

 $json_errors = array(
     JSON_ERROR_NONE => 'No error has occurred',
     JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded',
     JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
     JSON_ERROR_SYNTAX => 'Syntax error',
    );
    echo 'Last error : ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL;

如果我解析这个JSON,没有出现错误

 {"command":"E101","user_id":"someuser","movie_id":"movie_id","link_id":"link_id"}

唯一的区别是我将字符串数据存储到了movie_id和link_id中。为什么会这样呢?

JSON 数据 Bin2Hex() 7b22636f6d6d616e64223a2245313031222c226d6f7669655f6964223a226d6f7669655f6964222c226c696e6b5f6964223a226c696e6b5f6964227d00000000

我正在对 JSON 数据进行加密,并通过客户端对其进行解密以在服务器端进行解密。

下面是我的加密函数:

    public function ajax_enc($data){

    $vector = "myvector";
    $filter = new Zend_Filter_Encrypt(array('adapter' => 'mcrypt', 'key' => $this->_AJAXKEY));
    $filter->setVector($vector);
    $encrypted = $filter->filter($data);
    // bin2hex for user use case     
    return bin2hex($encrypted); // rawurlencode(..) works

    }

解密
public function ajax_dec($data)
{
$vector = "myvector";
$filter = new Zend_Filter_Decrypt(array('adapter' => 'mcrypt', 'key' => $this->_AJAXKEY ));
$filter->setVector($vector);
$decoded = pack('H*', $data);
$decrypted = $filter->filter($decoded);
return $decrypted;
}

你能展示更多的代码吗?包括确切的Ajax语句和执行json_decode的PHP代码。 - Pekka
1
如果是BOM,请尝试运行以下代码: if (substr($string, 0,3) == pack("CCC",0xef,0xbb,0xbf)) { $string = substr($string, 3); } - nkamm
@nkamn 我试过了,不起作用。 - Navneet Singh
@pekka 在 Ajax post 中,使用 Zend_Filter_Encrypt(array('adapter' => 'mcrypt', 'key' => "MYKEY" )) 对 JSON 数据进行加密,然后在服务器端将数据解密为有效的 JSON。 - Navneet Singh
我不理解你在这里做什么。你需要展示更多的代码。(你可以编辑到你的问题中) - Pekka
显示剩余5条评论
3个回答

3

你的解密似乎在字符串末尾留下了一堆填充的NUL字节。

要么修复你的解密机制,要么删除它们:trim($json, "\x0")


非常感谢,你解决了它,你确定这对所有的JSON字符串每次都有效吗? - Navneet Singh
任何JSON字符串的开头或结尾都不应该有NUL字节。所以,就NUL字节而言,这应该是有效的。 - deceze

2

To remove  do:

$json_raw_str = ltrim($json_raw_str, chr(239).chr(187).chr(191));

为什么?因为字节顺序标记239 187 191的十进制表示,ltrim将其从字符串开头删除。

之后执行:

$data = json_decode($json_raw_str);
// be fun :)

很难理解为什么你的答案可能有效。在解决方案中使用注释可能不是添加解释的最佳方式。你能否添加一个解释,说明你认为 OP 的问题是什么,以及为什么这样修复它? - DCTID
@DCTID,随意编辑帖子以符合要求。Leonan,我也不明白你的解决方案与所提出的问题有什么关系...(?) - brasofilo
这个工作正常。首先检查是否确实是这个问题 - https://dev59.com/CGQo5IYBdhLWcg3wQdit#16199148 - 然后使用这个修复方法。 - Gaurav Ojha

0

这对我有用(它删除了BOM):

$json = json_decode(ltrim($jsonString, "\xEF\xBB\xBF"), true);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接