6

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;
}
Navneet Singh
  • 1,218
  • 11
  • 17

3 Answers3

3

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")

deceze
  • 510,633
  • 85
  • 743
  • 889
  • Thank you very much , You solved it , Are you sure this will work every time for all the json strings ? – Navneet Singh Nov 27 '12 at 13:55
  • There should be no NUL bytes at the beginning or end of any JSON strings. So, yes, as far as NUL bytes go, this should work. – deceze Nov 27 '12 at 14:01
2

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 :)
brasofilo
  • 25,496
  • 15
  • 91
  • 179
  • It is difficult to understand why your answer might work. Using comments in the solution is probably not the best way to add an explanation. Can you add an explanation of what you think the OP's issue is and why this fixes it? – DCTID Aug 02 '19 at 23:40
  • @DCTID, feel free to edit posts into shape. Leonan, I'm also not understanding how your solution is related to the question presented... (?) – brasofilo Aug 03 '19 at 01:56
  • This worked correctly. Check if indeed this is the problem first - https://stackoverflow.com/a/16199148/4720042 - and then use this fix. – Gaurav Ojha Nov 25 '19 at 02:50
0

This worked for me (it removes the BOM):

$json = json_decode(ltrim($jsonString, "\xEF\xBB\xBF"), true);
Sliq
  • 15,937
  • 27
  • 110
  • 143