【问题标题】:json_decode doesnt decode server's response?json_decode 不解码服务器的响应?
【发布时间】:2011-12-29 23:46:28
【问题描述】:

我正在尝试解码 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() 中时,它是否正常?我哪里错了?

【问题讨论】:

  • 它确实有效:codepad.viper-7.com/O3nsWV
  • 你当前的代码到底输出了什么?
  • 这行得通,但如果我尝试解码 $s->result (其中包含您的 $json 所包含的内容),它不会

标签: php json character-encoding control-characters


【解决方案1】:

我猜$s-&gt;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-&gt;result) 删除。

【讨论】:

  • 嗯……如果json_encode 的结果是NULL,请尝试检查json_last_error() 的输出。
  • @Saulius: JSON_ERROR_CTRL_CHAR = 3 -- 这表明您很可能遇到了编码问题,正如 cbuckley 所指出的那样。
  • @Saulius:JSON 数据必须是 UTF-8。
  • 响应也可能包含回车符(它看起来像是来自 Windows 服务器)。试试str_replace(array("\r", "\n"), array('\r', '\n'), $s-&gt;result)
  • 是的,它一定是控制字符错误,str_replace 也没有帮助,有没有办法告诉 curl 返回 UTF8?
猜你喜欢
  • 2021-01-05
  • 2020-10-20
  • 2018-09-16
  • 2014-02-04
  • 1970-01-01
  • 2012-01-31
  • 2012-08-10
  • 2020-10-16
  • 1970-01-01
相关资源
最近更新 更多