1

我正在从具有相同代码的两个链接中进行简单的 JSON 抓取。我正在做两次不同的事情,所以我的问题的原因不是因为他们遇到了对方或其他什么。

这是我的代码:

@Override
        protected String doInBackground(Object... params) {
            try {
                URL weatherUrl = new URL("my url goes here");
                HttpURLConnection connection = (HttpURLConnection) weatherUrl
                        .openConnection();
                connection.connect();

                responseCode = connection.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    InputStream inputStream = connection.getInputStream();
                    Reader reader = new InputStreamReader(inputStream);
                    int contentLength = connection.getContentLength();
                    char[] charArray = new char[contentLength];
                    reader.read(charArray);
                    String responseData = new String(charArray);
Log.v("test", responseData);

当我尝试这个时:

http://www.google.com/calendar/feeds/developer-calendar@google.com/public/full?alt=json

我收到数组长度为 -1 的错误

对于这个链接:

http://api.openweathermap.org/data/2.5/weather?id=5815135

它返回正常,我得到了所有 JSON 的日志。有谁知道为什么?

注意:我尝试在调试模式下单步执行我的代码,但我什么也抓不到。我还下载了一个用于在浏览器中解析 json 的 Google chrome 扩展程序,两个 url 看起来都完全有效。我没主意了。

4

1 回答 1

3

记录这个:int contentLength = connection.getContentLength();

我没有看到 google url 返回content-length标题。

如果您只想从 url 输出字符串,您可以ScannerURL这样使用:

Scanner s = new Scanner(new URL("http://www.google.com").openStream(), "UTF-8").useDelimiter("\\A");
out = s.next();
s.close();

(不要忘记 try/finally 阻塞和异常处理)

更长的方式(允许进度报告等):

String convertStreamToString(InputStream is) throws UnsupportedEncodingException {

      BufferedReader reader = new BufferedReader(new    
                              InputStreamReader(is, "UTF-8"));
      StringBuilder sb = new StringBuilder();
      String line = null;
      try {
          while ((line = reader.readLine()) != null)
              sb.append(line + "\n");
      } catch (IOException e) {
          // Handle exception
      } finally {
          try {
              is.close();
          } catch (IOException e) {
              // Handle exception
          }
      }
      return sb.toString();
   }
}

然后调用 String response = convertStreamToString( inputStream );

于 2013-07-31T23:45:59.490 回答