【问题标题】:JSON Serialisation from URL always returning NULL来自 URL 的 JSON 序列化总是返回 NULL
【发布时间】:2015-01-13 19:42:55
【问题描述】:

我有一个 Web URL,它根据请求返回 JSON 格式的字符串

{"StockID":0,"LastTradePriceOnly":"494.92","ChangePercent":"0.48"}

我正在使用 Java 进行流式传输

InputStream in = null;
in = url.openStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder sb = new StringBuilder();

String line = null;
try {
     while ((line = reader.readLine()) != null) {
     sb.append(line + "\n");
     }


} 
catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            String result = sb.toString();

但是reader.readLine() 总是返回null

知道我在这里做错了什么吗?

这里是实际的 JSON 地址http://app.myallies.com/api/quote/goog

更新

相同的代码在 http://app.myallies.com/api/news 上运行正常,尽管两个链接具有相同的服务器实现来生成 JSON 响应。

【问题讨论】:

  • 是否出现实际错误?
  • Google 有一些不错的 POJO 序列化库。 code.google.com/p/google-gson
  • @Aify 没有错误,只是一个空的阅读器
  • 如果它只是一个空的阅读器,你试过冲洗它吗?另外,这个:stackoverflow.com/questions/4308554/…
  • 更新的问题,相同的代码在服务器上的另一个 JSON 资源上运行良好

标签: java android json serialization deserialization


【解决方案1】:

看起来它就是它想要的用户代理。以下代码适用于我:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class JSONTest {

    public static void main(String[] args) throws Exception {

        URL url = new URL("http://app.myallies.com/api/quote/goog");

        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0");
        connection.setDoInput(true);

        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        StringBuilder sb = new StringBuilder();

        String line = null;
         while ((line = reader.readLine()) != null) {
             sb.append(line + "\n");
         }

         System.out.println(sb.toString());

    }

}

【讨论】:

  • 哇,你真的是对的!我已经检查了文档,看起来您必须发送一个特殊标志来处理用户代理,以表明您不是机器人或搜索引擎。非常感谢,我希望我能投票两次!
【解决方案2】:

您获得 null 的原因是 Java 发出的请求与您的浏览器发出的请求不同。您的浏览器包含许多 Java 不会填充的请求标头,除非您明确这样做。不过,我不确定为什么网络服务器不响应基本请求。您可以通过以下方式自行测试:

基本请求(无标头):

curl http://app.myallies.com/api/quote/goog  

结果:null

带有标头的请求:

curl \
-H "Host: app.myallies.com" \
-H "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0" \
-H "Accept: text/html,application/xhtml,application/xml;q=0.9,*/*;q=0.8" \
-H "Accept-Language: en-US,en;q=0.5" \
-H "Accept-Encoding: gzip, deflate" \
-H "Connection: keep-alive" \
-H "Cache-Control: max-age=0" \
http://app.myallies.com/api/quote/goog`  

结果:{"StockID":0,"LastTradePriceOnly":"496.38","ChangePercent":"0.78"}

您可能必须设置一些请求标头以更接近地模仿浏览器发出的请求。

【讨论】:

  • 好的,答案是有道理的,但如果是这样的话,那么来自完全相同代码的请求如何与 app.myallies.com/api/recentnews 一起工作呢?这才是真正让我眼花缭乱的地方!
  • 这很奇怪。可能是他们实现这些服务的错误。 99% 的情况下,开发人员只是在前端使用浏览器,所以他们永远不会注意到这个错误。
猜你喜欢
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
相关资源
最近更新 更多