JAVA使用JSON检索当前比特币价格

时间:2014-03-22 22:44:26

标签: java json bitcoin

我希望通过使用JSON获得当前/历史比特币价格。

但是,代码显示以下错误

Exception in thread "main" java.lang.NullPointerException at RwithJlab.Basic.main(Basic.java:19)

---------------------------------代码------------- --------------------

package RwithJlab;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class Basic 
{
    public static void main(String[] args) throws MalformedURLException, IOException, JSONException
    {
        JSONObject data = getJSONfromURL("https://blockchain.info/charts/market-price?format=json");
        JSONArray data_array = data.getJSONArray("values");

        for (int i = 0; i < ((CharSequence) data_array).length(); i++)
        {
            JSONObject price_point = (JSONObject) data_array.get(i);

            //  Unix time
            int x = price_point.getInt("1364062505");

            //  Bitcoin price at that time
            double y = price_point.getDouble("y");

            //  Do something with x and y.
            System.out.println(x);

        }

    }

    public static JSONObject getJSONfromURL(String URL) throws JSONException
    {
        try
        {
            URLConnection uc;
            URL url = new URL(URL);
            uc = url.openConnection();
            uc.setConnectTimeout(10000);
            uc.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
            uc.connect();

            BufferedReader rd = new BufferedReader(
                    new InputStreamReader(uc.getInputStream(), 
                    Charset.forName("UTF-8")));

            StringBuilder sb = new StringBuilder();
            int cp;
            while ((cp = rd.read()) != -1)
            {
                sb.append((char)cp);
            }

            String jsonText = (sb.toString());            

            return new JSONObject(jsonText.toString());
        } catch (IOException ex)
        {
            return null;
        }
    }
}

请帮助

2 个答案:

答案 0 :(得分:0)

当你捕获它们时,你至少应该记录异常,否则当发生异常时你就不了解了。

在您的情况下,您正在抓取IOException并返回null。这导致NullPointerException之后,但您无法看到根本原因。

记录IOException(至少致电ex.printStackTrace()),您将看到真正的原因。

答案 1 :(得分:0)

您在JSONException行得到int x = price_point.getInt("1364062505");

首先,查看您要检索的URL的源JSON。

它的结构是:

values: [ {x : timestamp, y : value}, ... ]

其中 时间戳 是用毫秒表示的日期,而 是BTC的美元价格

您正在尝试getInt("1364062505"),而values JSON数组中的此类键不存在。

如果找不到密钥或无法将值转换为整数(look here),则将

JSONException抛出到getInt(key)

您需要写int x = price_point.getInt("x"),或者甚至更好-将getInt()替换为optInt(),将getDouble()替换为optDouble()。在这种情况下,如果JSONObject中的键不存在,则不会有任何例外,只有零。然后,您应该在if (value != 0)块中检查您的值