json_decode不解码服务器的响应?

时间:2011-12-29 23:46:29

标签: php json character-encoding control-characters

我正在尝试解码selenium服务器的响应。服务器返回:

{"sessionId":null,"status":0,"value":{"os":{"arch":"amd64","name":
"Windows Server 2008 R2","version":"6.1"},"java":{"version":"1.7.0_02"},
"build":{"revision":"15105","time":"2011-12-08 09:56:25","version":"2.15.0"}},
"class":"org.openqa.selenium.remote.Response","hCode":1813953336}

我想用以下内容对其进行解码:

$json = json_decode($s->result);
echo '<pre>'.print_r($json, 1).'</pre>';

在这个阶段,$ s对象是:

Scrape Object
(
    [headers] => Array
        (
        )

    [result] => {"sessionId":null,"status":0,"value":{"os":{"arch":"amd64","name":"Windows Server 2008 R2","version":"6.1"},"java":{"version":"1.7.0_02"},"build":{"revision":"15105","time":"2011-12-08 09:56:25","version":"2.15.0"}},"class":"org.openqa.selenium.remote.Response","hCode":287101789}
    [http_code] => 200
    [error] => 
)

然而,当我实际将结果粘贴到json_decode()时,它做得很好吗?我哪里错了?

1 个答案:

答案 0 :(得分:3)

我猜测$s->result是HTML响应主体,并且它不会以UTF-8编码的数据返回(因此json_encode返回NULL)。这是服务器端的问题,因为JSON应该是UTF-8编码的。理想情况下,服务器将使用Content-Type标头进行响应,告诉您响应正文的编码。

但是,您可以通过在响应中调用utf8_encode来解决此问题:

$json = json_decode(utf8_encode($s->result));
echo '<pre>' . print_r($json, 1) . '</pre>';

这仅在响应符合ISO-8859-1时才有效。作为附加检查,您可能希望使用mb_detect_encoding检测响应的编码。然后,您可以将结果传递到iconv

$json = json_decode(iconv($sourceEncoding, 'UTF-8', $s->result));
echo '<pre>' . print_r($json, 1) . '</pre>';

如果所有其他方法都失败了,请查看json_last_error的输出:

if ($json === null) {
    var_dump(json_last_error());
}

编辑:此案例中的错误为JSON_ERROR_CTRL_CHAR;响应中包含许多NUL字符,这些字符已使用str_replace("\0", '', $s->result)删除。

相关问题