当前位置: 首页 > 面试题库 >

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

韦俊英
2023-03-14
问题内容

我有一种感觉,我在这里做错了什么,但是我不确定是错过了一步,还是遇到编码问题或其他问题。这是我的代码:

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);
   }

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


问题答案:

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

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这样的更智能的客户端(尽管您需要进行一些调整才能使它自动说出Gzip),或者显式解压缩示例代码中获得的流。对于声明输入的行,请尝试以下操作:

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

我已验证该方法适用于您尝试获取的网址。



 类似资料:
  • 问题内容: 我在file.txt中有以下数据: 我想将字符串替换为“-”之后的字符串,最多替换为“;” 只需加上“;”,就可以得到: 我尝试使用以下命令: 但这给了我以下错误: sed命令出现乱码 为什么会这样呢? 问题答案: 这应该工作:

  • 我有一条可以观察到的溪流。第一个运算符是一个mergeMap,它返回一个可观察的数组。然后,我必须有第二个mergeMap从第一个mergeMap的返回中获取最终值。我觉得这第二个合并映射应该是不必要的,但找不到绕过它的方法。 例子: 这最终是我所拥有的。第二个mergeMap只存在于订阅第一个的输出。没有它,我的输出是可观察的(即(1)的

  • 我想这样做: js中是否有一种方法可以调用同步代码中的函数,并仅在我的controlVar变为1时返回值? 这不应该阻止,因为当我使用setTimeout时,主循环应该能够控制,但是如果阻止对我来说并不重要。 谢谢

  • 我知道显示输出的其他方式。但我想知道是否可以直接检索返回数组的元素。

  • 问题内容: 我没有任何例外,但是当我跑步时… 然后,deckFile.read()返回-1。该文件位于正确的文件夹中,并且不为空。 这应该是世界上最容易的事情。 编辑:AssetManager实际上确实在那里列出“ cards.txt”,所以这不应该是问题。 问题答案: 问题是我的文件太大,并且由于扩展名为“ .txt”而被压缩了。通过将文件重命名为通常已压缩的格式“ .mp3”,就没有问题

  • 此页返回一个空摘要: https://fr.wikipedia.org/w/api.php?action=query 但同样的查询适用于其他页面:https://fr.wikipedia.org/w/api.php?action=query 添加“ 我做错什么了吗?