Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

json_decode returns NULL after webservice call

Tags:

json

php

There is a strange behaviour with json_encode and json_decode and I can't find a solution:

My php application calls a php web service. The webservice returns json that looks like this:

var_dump($foo): string(62) "{"action":"set","user":"123123123123","status":"OK"}" 

now I like to decode the json in my application:

$data = json_decode($foo, true) 

but it returns NULL:

var_dump($data): NULL 

I use php5. The Content-Type of the response from the webservice: "text/html; charset=utf-8" (also tried to use "application/json; charset=utf-8")

What could be the reason?

like image 532
schouk Avatar asked Mar 27 '09 10:03

schouk


People also ask

What does json_decode return?

The json_decode() function can return a value encoded in JSON in appropriate PHP type. The values true, false, and null is returned as TRUE, FALSE, and NULL respectively. The NULL is returned if JSON can't be decoded or if the encoded data is deeper than the recursion limit.

What is Json_encode and json_decode?

JSON data structures are very similar to PHP arrays. PHP has built-in functions to encode and decode JSON data. These functions are json_encode() and json_decode() , respectively. Both functions only works with UTF-8 encoded string data.

What Is syntax error malformed JSON?

The malformed JSON error means that the format of the API call is incorrect.

Does json_decode return array?

json - json_decode does not return array in php - Stack Overflow. Stack Overflow for Teams – Start collaborating and sharing organizational knowledge.


2 Answers

Well, i had a similar issue and the problems was the PHP magic quotes in the server... here is my solution:

if(get_magic_quotes_gpc()){   $param = stripslashes($_POST['param']); }else{   $param = $_POST['param']; } $param = json_decode($param,true); 
like image 77
Pablo Avatar answered Oct 06 '22 09:10

Pablo


EDIT: Just did some quick inspection of the string provided by the OP. The small "character" in front of the curly brace is a UTF-8 B(yte) O(rder) M(ark) 0xEF 0xBB 0xBF. I don't know why this byte sequence is displayed as  here.

Essentially the system you aquire the data from sends it encoded in UTF-8 with a BOM preceding the data. You should remove the first three bytes from the string before you throw it into json_decode() (a substr($string, 3) will do).

string(62) "{"action":"set","user":"123123123123","status":"OK"}"             ^             |             This is the UTF-8 BOM 

As Kuroki Kaze discovered, this character surely is the reason why json_decode fails. The string in its given form is not correctly a JSON formated structure (see RFC 4627)

like image 27
Stefan Gehrig Avatar answered Oct 06 '22 07:10

Stefan Gehrig