如何将JSON中的货币与对应值存入ArrayList?(Android场景)
嘿,作为刚接触这个领域的新手,能自己发起REST请求拿到响应已经很棒啦!我来一步步教你怎么把这些货币和对应的汇率值存入ArrayList里~
首先,我们需要先定义一个简单的数据类,用来封装每一组“货币代码-汇率”的信息,这样存到列表里会更清晰:
public class CurrencyRate { private String currencyCode; private double rate; // 构造方法 public CurrencyRate(String currencyCode, double rate) { this.currencyCode = currencyCode; this.rate = rate; } // 可选:添加getter方法,方便后续获取数据 public String getCurrencyCode() { return currencyCode; } public double getRate() { return rate; } }
接下来分两种方法给你演示解析JSON并存入ArrayList:
方法一:用Android原生的JSONObject解析(无需额外依赖)
假设你已经拿到了完整的JSON响应字符串(比如命名为jsonResponse),可以在onCreate里这么写:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity_layout); // 记得替换成你的布局文件名 // 这里替换成你实际拿到的完整JSON响应 String jsonResponse = "{\"success\":true,\"timestamp\":1524649444,\"base\":\"EUR\",\"date\":\"2018-04-25\",\"rates\":{\"AED\":4.486623,\"AFN\":85.583411,\"ALL\":128.283655,...}}"; // 初始化用来存数据的ArrayList ArrayList<CurrencyRate> currencyRatesList = new ArrayList<>(); try { // 解析最外层的JSON对象 JSONObject mainJsonObj = new JSONObject(jsonResponse); // 取出里面的"rates"对象,这就是存所有货币汇率的地方 JSONObject ratesJsonObj = mainJsonObj.getJSONObject("rates"); // 遍历rates对象里的所有键值对 Iterator<String> currencyKeys = ratesJsonObj.keys(); while (currencyKeys.hasNext()) { String code = currencyKeys.next(); // 获取货币代码,比如AED、AFN double rateValue = ratesJsonObj.getDouble(code); // 获取对应的汇率值 // 创建CurrencyRate对象并添加到列表里 currencyRatesList.add(new CurrencyRate(code, rateValue)); } // 测试一下:打印列表里的数据 for (CurrencyRate item : currencyRatesList) { Log.d("汇率数据", item.getCurrencyCode() + " : " + item.getRate()); } } catch (JSONException e) { e.printStackTrace(); // 这里可以处理解析失败的情况,比如给用户弹个提示 } }
方法二:用Gson解析(更简洁,需要添加依赖)
如果觉得原生解析有点繁琐,可以用Google的Gson库,它能帮我们自动把JSON转换成Java对象,省掉手动遍历的步骤。
首先在你的app/build.gradle里添加Gson的依赖:
implementation 'com.google.code.gson:gson:2.10.1'
然后定义一个对应整个JSON结构的模型类:
public class ExchangeRateResponse { private boolean success; private long timestamp; private String base; private String date; private Map<String, Double> rates; // 用Map来接收所有货币汇率 // 只需要给rates加getter方法就够了,其他字段如果用不到可以不用加 public Map<String, Double> getRates() { return rates; } }
接下来就可以快速解析并转成ArrayList了:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity_layout); String jsonResponse = "你的完整JSON响应字符串"; ArrayList<CurrencyRate> currencyRatesList = new ArrayList<>(); // 用Gson解析JSON Gson gson = new Gson(); ExchangeRateResponse response = gson.fromJson(jsonResponse, ExchangeRateResponse.class); // 把Map里的键值对转成CurrencyRate对象并存入ArrayList for (Map.Entry<String, Double> entry : response.getRates().entrySet()) { currencyRatesList.add(new CurrencyRate(entry.getKey(), entry.getValue())); } // 同样可以打印测试 for (CurrencyRate item : currencyRatesList) { Log.d("汇率数据", item.getCurrencyCode() + " : " + item.getRate()); } }
最后提醒你一句:Android里不能在主线程发起网络请求哦!如果你的REST请求是在onCreate里直接写的,会报NetworkOnMainThreadException,建议用Kotlin协程、Java的AsyncTask或者Retrofit这些工具来处理网络请求~
内容的提问来源于stack exchange,提问作者Afik Menashe
相关产品推荐
相关产品推荐

