java - 来自 StackExchange API 的 JSON URL 返回乱码?

标签 java json url stackexchange-api

我觉得我在这里做错了什么,但我不太确定我是否遗漏了一个步骤,或者只是遇到了编码问题或其他问题。这是我的代码:

URL url = new URL("http://api.stackoverflow.com/0.8/questions/2886661");

   BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
   // Question q = new Gson().fromJson(in, Question.class);
   String line;
   StringBuffer content = new StringBuffer();
   while ((line = in.readLine()) != null)
   {
    content.append(line);
   }

当我打印内容时,我得到一大堆 wingdings 和特殊字符,基本上是乱码。我会在此处复制并粘贴它,但这不起作用。我做错了什么?

最佳答案

在这种情况下不是字符编码问题,而是内容编码问题;您期待文本,但服务器正在使用压缩来节省带宽。如果您在抓取该 url 时查看 header ,您可以看到您正在连接的服务器正在返回 gzip 压缩的内容:

GET /0.8/questions/2886661 HTTP/1.1
Host: api.stackoverflow.com

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 22 May 2010 15:51:34 GMT
Content-Type: application/json; charset=utf-8
<more headers>
Content-Encoding: gzip
<more headers>

因此,您要么需要像 stevedbrown 所建议的那样使用像 Apache 的 HttpClient 这样更智能的客户端(尽管您需要 a tweak to get it to speak Gzip automatically ),要么显式解压缩您在示例代码中获得的流。尝试在您声明输入的行中使用此方法:

 BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(url.openStream())));

我已经验证这对您尝试获取的 url 有效。

关于java - 来自 StackExchange API 的 JSON URL 返回乱码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2888647/

相关文章:

java - 通过依赖注入(inject)创建的动态类型对象

java - 当我在 statechange 上显示对话框时,JCheckbox 更改状态两次,如何解决?

Python-JSON 值错误 : Extra data

url - 如何为不区分大小写的 URL 配置 Tomcat?

php - 使用 php 变量 + javascript 变量创建一个 href url

Java:一元 if - npe

json - 使用 JSON_MODIFY 附加到空白列失败,并出现 "Unexpected character ' .' is found at position 0"错误

python - 使用 python 将数据附加到 JSON 文件

java - 如何使用 Java Jersey 对路径参数进行编码

Java SSL 客户端身份验证 : How to select alias in Keystore?