我正在尝试解码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()时,它做得很好吗?我哪里错了?
答案 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)
删除。