webservice调用后,json_decode返回NULL

sch*_*ouk 57 php json

有一个奇怪的行为json_encodejson_decode我不能找到一个解决方案:

我的php应用程序调用php Web服务.webservice返回如下所示的json:

var_dump($foo):
string(62) "{"action":"set","user":"123123123123","status":"OK"}"
Run Code Online (Sandbox Code Playgroud)

现在我想在我的应用程序中解码json:

$data = json_decode($foo, true)
Run Code Online (Sandbox Code Playgroud)

但它返回NULL:

var_dump($data):
NULL
Run Code Online (Sandbox Code Playgroud)

我用的是php5.来自webservice的响应的Content-Type :( "text/html; charset=utf-8"也尝试使用"application/json; charset=utf-8")

可能是什么原因?

Pab*_*blo 75

好吧,我有一个类似的问题,问题是服务器中的PHP魔术引号......这是我的解决方案:

if(get_magic_quotes_gpc()){
  $param = stripslashes($_POST['param']);
}else{
  $param = $_POST['param'];
}
$param = json_decode($param,true);
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢Pablo的回答!! 你救了我很多时间!! (3认同)
  • 干杯哥们,没想到魔术引号会引起这样的问题,几乎是在对显示器大喊大叫的时候.干杯. (3认同)

Ste*_*rig 64

编辑: 刚刚对OP提供的字符串进行了一些快速检查.花括号前面的小"字符"是UTF-8 B(yte)O(rder)M(方舟) 0xEF 0xBB 0xBF.我不知道为什么这个字节序列显示在?这里.

基本上,您从中获取数据的系统会以UTF-8编码,并在数据之前使用BOM.你应该先把它从字符串中删除前三个字节,然后再把它扔进去json_decode()(a substr($string, 3)会做).

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

正如Kuroki Kaze所发现的,这个角色肯定是json_decode失败的原因.给定形式的字符串不是正确的JSON格式结构(请参阅RFC 4627)

  • 不是大括号 - 大括号前面有一个字符. (8认同)
  • 我认为这样的格式化试图让这个问题难以回答.:-P (5认同)
  • - >好吧,Notepad ++让我看到这个角色.我的FF3没有显示它...非常感谢!:) (2认同)
  • @StefanGehrig这是一个古老的问题/答案,但我找到了一个更好的解决方案来删除UTF-8 BOM:http://stackoverflow.com/a/15423899/1128918.因为它使用`preg_replace`而不是`(mb_)substr`它将处理带有和不带BOM的字符串.如果你能更新你的答案会很好.;) (2认同)

小智 33

调试时打印最后一个json错误.

json_decode( $so, true, 9 );
$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.stringify()函数来仔细检查您的JSON语法.

  • 不是解决方案,但帮助了解错误 (2认同)

djb*_*djb 28

上面的解决方案都没有为我工作,但是html_entity_decode($json_string)做到了

  • 谢谢!!我花了几个小时尝试不同的解决方案,这是唯一有效的方法。 (2认同)

Óla*_*age 19

试试这个

$foo = utf8_encode($foo);
$data = json_decode($foo, true);
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,所有其他提到的答案都不起作用. (2认同)

ika*_*ary 8

确保如果您通过POST/GET发送数据,则服务器无法转义引号

$my_array = json_decode(str_replace ('\"','"', $json_string), true);
Run Code Online (Sandbox Code Playgroud)


Kur*_*aze 5

"?{"action":"set","user":"123123123123","status":"OK"}"
Run Code Online (Sandbox Code Playgroud)

这个小撇号一开始 - 它是什么?双引号后的第一个符号.

  • 我找不到一点撇号.双引号后面的第一个符号是一个大括号. (4认同)

小智 5

我在一个实时站点中遇到了类似的问题。在我的本地站点,它运行良好。为了修复相同的问题,我刚刚添加了以下代码

json_decode(stripslashes($_GET['arr']));


小智 5

我只是把这个

$result = mb_convert_encoding($result,'UTF-8','UTF-8'); 
    $result = json_decode($result);
Run Code Online (Sandbox Code Playgroud)

它正在工作