将JSON解析为自定义ArrayList,仅返回最后一项?

我发现这有点奇怪,我正在从我的/ assets文件夹中的文件解析一些JSON。 我已经设置了一个自定义ArrayList。 现在,当我尝试将ArrayList中的数据添加到listview或spinner(Same adapter)时,它只显示最后一项。 这是我的代码:

我的解析方法:

public ArrayList parseJSON(String json) { ArrayList shop = new ArrayList(); ShopName item = new ShopName(); Log.d(TAG, json); try { JSONArray jArray = new JSONArray(json); for (int i=0; i < jArray.length();i++) { JSONObject jObject = jArray.getJSONObject(i); item.setFromCurrency(jObject.getString("from")); item.setToCurrency(jObject.getString("to")); item.setRate(jObject.getString("cost")); data.add(item); } } catch (JSONException jen) { jen.printStackTrace(); } return shop; } 

我不太确定我的错误在哪里。 我错误地解析它,也许,错误地存储它? 我有一种感觉,这是我的ArrayList,但我确定我应该做些什么来解决它,我尝试使用不同的Adapters,并搜索StackOverflow,但它们都有不同的问题所以现在很难缩小。

我很感激你的帮助。 谢谢。

 public ArrayList parseJSON(String json) { ArrayList data = new ArrayList<>(); // Data item = new Data(); // Move this into for loop Log.d(TAG, json); try { JSONArray jArray = new JSONArray(json); for (int i=0; i < jArray.length();i++) { Data item = new Data(); JSONObject jObject = jArray.getJSONObject(i); item.setFromCurrency(jObject.getString("from")); item.setToCurrency(jObject.getString("to:")); item.setRate(jObject.getString("rate")); data.add(item); } } catch (JSONException je) { Log.d(TAG, je.getMessage()); } return data; } 

您只初始化项目对象一次,这就是原因。 移动

 Data item = new Data(); 

进入你的for循环。

您应该为每个JSON数组项创建新的Data对象。

 public ArrayList parseJSON(String json) { // remove this // Data item = new Data(); ... try { JSONArray jArray = new JSONArray(json); for (int i=0; i < jArray.length();i++) { // move it here Data item = new Data(); ... data.add(item); } } catch (JSONException je) { Log.d(TAG, je.getMessage()); } return data; }