在Java中从URL提取实时汇率

3
我试图编写一个程序,使用实时汇率将给定货币兑换为另一种货币。 以下是我从exchangeratesapi.io获取数据的方法:
    URL url = new URL("https://api.exchangeratesapi.io/latest?symbols=USD,GBP");
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod("GET");

    BufferedReader in = new BufferedReader(new InputStreamReader(
        con.getInputStream()));
    String inputLine;
    while ((inputLine = in.readLine()) != null) {
      System.out.println(inputLine);
    }

该代码返回当前汇率是({"rates":{"USD":1.1029,"GBP":0.84183},"base":"EUR","date":"2020-01-30"}),但我不知道如何将其中的1.1029用于方程式。

3个回答

1
"base" 是欧元。如果您查看他们的 Github 页面here,您将在 README 中看到它说:“默认情况下报价是以欧元为基础的。通过在请求中设置基本参数来针对不同的货币进行报价。”这意味着如果您输入 100,则它正在查看 100 欧元的汇率。因此,要找到另一个值,应该是:
金额 * 汇率 = 该符号的价值
所以在那个 100 欧元的例子中:
100 * 1.1029 = 110.29 美元。
编辑:根据您的评论更新。以下是如何使用您可以在 here 找到的 org.json 库获取该值。
  public static void main(String[] args) throws ParseException {
    String jsonString = "{ \"rates\" : { \"USD\" : 1.1029, \"GBP\" : 0.84183 }, \"base\" : \"EUR\", \"date\" : \"2020-01-30\" }";
    double rate = getExchangeRate(jsonString);
    System.out.println(rate);
  }


  public static double getExchangeRate(String jsonInput) {
    JSONObject object = new JSONObject(jsonInput);
    double rate = object.getJSONObject("rates").getDouble("USD");
    return rate;
  }

输出:

1.1029

如果您是第一次使用这种东西且JSON令您感到困惑,我建议您阅读一些有关其工作原理的教程。一个很好的开始是这里
希望这可以帮到您!

那么我该如何获取汇率呢? - ozajasz15
你是在问如何解析JSON吗?我只是想要澄清一下,这样我才能更好地回答你。 - djharten
是的,我认为这就是我需要的。我想从网站上获取一个数字,然后将其放入计算中,得出所需数量*(所需数字) = 新货币的价值。 - ozajasz15

1
使用JSONObject导入:
import org.json.JSONObject;

在你的代码的最后几行做了一些小修改:
URL url = new URL("https://api.exchangeratesapi.io/latest?symbols=USD,GBP");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");

BufferedReader in = new BufferedReader(new InputStreamReader(
    con.getInputStream()));

String jsonText = readAll(in);
JSONObject yourData = new JSONObject(jsonText);

这是readAll:

private static String readAll(Reader rd) throws IOException {
    StringBuilder sb = new StringBuilder();
    int cp;
    while ((cp = rd.read()) != -1) {
            sb.append((char) cp);
    }
    return sb.toString();
}

之后,您的数据将是一个 JSONObject,您可以像这样获取所请求的值:
double yourRate = yourData.getJSONObject("rates").getDouble("USD");

非常感谢,这确实有帮助。我遇到的唯一问题是出现了一个错误: 方法 getFloat(String) 在类型 JSONObject 中未定义。 - ozajasz15
糟糕,应该是double类型。这是我的错!double yourRate = .... getDouble("USD");(将我答案中错误的float改为double类型) - funky
运行错误:Error: Unable to initialize main class mainpackage1.CurrencyExchange Caused by: java.lang.NoClassDefFoundError: org/json/JSONException 我已经将java-json.jar添加到我的库中,但仍然存在这个问题。 - ozajasz15
这可能会对您有所帮助:https://dev59.com/uGUo5IYBdhLWcg3wkADB#15951178 - funky
后来出了一些问题,但现在一切都正常了。非常感谢! - ozajasz15

0
class Rate {
   public double USD;
   public double GBP;

}

class RateContainer{
    public Rate rates;
    public String base;
    public String date;

}

在你的 Gradle 文件中:

dependencies {
  implementation 'com.google.code.gson:gson:2.8.6'
}

Gson gson = Gson();
RateContainer container = gson.fromJson(inputLine,RateContainer.class);

Systen.out.println(container.rates.USD + "");

对不起,请问第二段代码是什么意思?我的Gradle文件是什么? - ozajasz15
你使用哪个构建系统? - Lena Bru
你使用哪个集成开发环境(IDE)? - Lena Bru
我正在使用 Eclipse。 - ozajasz15
https://medium.com/programmers-blockchain/importing-gson-into-eclipse-ec8cf678ad52 - Lena Bru
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接