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

时间:2015-03-22 01:36:33

标签: java android json listview arraylist

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

我的解析方法:

public ArrayList<ShopName> parseJSON(String json) {

    ArrayList<ShopName> 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但是它们都有不同的问题因此现在很难缩小。

感谢您对此的帮助。谢谢。

3 个答案:

答案 0 :(得分:2)

public ArrayList<Data> parseJSON(String json) {

    ArrayList<Data> 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;
}

答案 1 :(得分:2)

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

Data item = new Data();

进入你的for循环。

答案 2 :(得分:0)

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

public ArrayList<Data> 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;
}
相关问题