Question

I want to decode the JSON data and store it in to an array using json_decode function but it's return NULL Value. I think it's because of UTF-8 BOM. Any Solution ? Im using Windows7 OS with xampp. I set my Encoding to

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

JSON DATA

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

JSON Error: Control character error, possibly incorrectly encoded

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

IF I Parse this JSON, No error Occured

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

The Only difference is Im storing string data in to movie_id and link_id . Why this happened ?

JSON Data Bin2Hex() 7b22636f6d6d616e64223a2245313031222c226d6f7669655f6964223a226d6f7669655f6964222c226c696e6b5f6964223a226c696e6b5f6964227d00000000

Im Encrypting the JSON data and via client side, im decrypting at the server side.

Here goes my Encryption function

    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

    }

Decrypt

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;
}
Was it helpful?

Solution

Your decryption has apparently left a bunch of padding NUL bytes at the end of the string.

Either fix your decryption mechanism or trim them: trim($json, "\x0")

OTHER TIPS

To remove  do:

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

Why? Because Byte_order_mark 239 187 191 is the decimal representation of  and ltrim remove them from the begining of the string.

After this do:

$data = json_decode($json_raw_str);
// be fun :)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top