Количество массивов Android JSON

По мере того как я углубляюсь в Android, я перешел к JSON и загрузился в RecyclerView. Теперь он работает нормально, за исключением того, сколько он будет загружен принудительно. В настоящее время я загружаю 40 элементов, которые есть на моем веб-сайте. Теперь, если я пойду и создам новое сообщение на веб-сайте, я получу сообщение об ошибке в моем приложении, потому что оно не соответствует тому, сколько я объявил в моем цикле FOR.

Мой вопрос: как мне сделать так, чтобы цикл не приводил к определенному количеству результатов, а просто захватил их все?

private void parsejson(String response) {

        List<DataMembers> data = new ArrayList<>();

        try {
            JSONArray jsonArray = new JSONArray(response);
            for(int i=0;i<40;++i) {
                DataMembers dataMembers = new DataMembers();

                JSONObject jsonObject = new JSONObject();
                jsonObject = (JSONObject) jsonArray.get(i);
                Log.i("Imported: ", Integer.toString(jsonObject.getInt("id")));

                    JSONObject jsonObject1 = new JSONObject();
                    JSONObject jsonObject2 = new JSONObject();
                    JSONObject jsonObject3 = new JSONObject();
                    JSONObject jsonObject4 = new JSONObject();
                    jsonObject1 = (JSONObject) jsonObject.get("title");
                    jsonObject3 = (JSONObject) jsonObject.get("excerpt");
                    jsonObject4 = (JSONObject) jsonObject.get("better_featured_image");
                    jsonObject2 = (JSONObject) jsonObject.get("content");
                    dataMembers.postTitle = jsonObject1.getString("rendered");
                    dataMembers.postCode = jsonObject2.getString("rendered");
                    dataMembers.postExcerpt = jsonObject3.getString("rendered");
                    dataMembers.imgurl = jsonObject4.getString("source_url");
                    dataMembers.postId = jsonObject.getInt("id");

                    temp[i] = dataMembers.postCode;
                    dataMembers.posturl = jsonObject.getString("link");

                    data.add(dataMembers);
            }
            rview.setAdapter(new RecyclerAdapter(RestActivity.this,data));
        }
        catch (Exception e) {
            e.printStackTrace();
        }

    }

Не зацикливайтесь на количестве элементов массива как 40, вместо этого выясните это из доступного apis JSONArray (длина)

JoxTraex 20.07.2018 23:41
1
1
580
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте JsonArray.length ()

JsonArray.length () дает размер или количество JsonArray.

int length = jsonArray.length();

private void parsejson(String response) {

    List<DataMembers> data = new ArrayList<>();

    try {
        JSONArray jsonArray = new JSONArray(response);

        for(int i=0;i< jsonArray.length();++i) 
        {
            DataMembers dataMembers = new DataMembers();
            // The rest of the code goes here
         } // End for
        }  // End Try
     }    // End method parsejson

https://developer.android.com/reference/org/json/JSONArray

Ответ принят как подходящий

Вот каким должен быть ваш код

try {
    JSONArray jsonArray = new JSONArray(response);
    for(int i=0; i<jsonArray.length(); ++i) {
        DataMembers dataMembers = new DataMembers();

        JSONObject members = jsonArray.getJSONObject(i);
        Log.i("Imported: ", Integer.toString(members.getInt("id")));

        JSONObject title = members.getJSONObject("title");
        JSONObject exercpt = members.getJSONObject("excerpt");
        JSONObject image = members.getJSONObject("better_featured_image");
        JSONObject content = members.getJSONObject("content");

        dataMembers.postTitle = title.getString("rendered");
        dataMembers.postCode = content.getString("rendered");
        dataMembers.postExcerpt = exercpt.getString("rendered");
        dataMembers.imgurl = image.getString("source_url");
        dataMembers.postId = members.getInt("id");

        temp[i] = dataMembers.postCode;
        dataMembers.posturl = members.getString("link");

        data.add(dataMembers);
    }
    rview.setAdapter(new RecyclerAdapter(RestActivity.this,data));
}
catch (Exception e) {
    e.printStackTrace();
}

Используйте длину JSONArray вместо жестко запрограммированного числа. Также не делайте таких вещей, как

JSONObject jsonObject1 = new JSONObject();
jsonObject1 = (JSONObject) jsonObject.get("title");

Он создает совершенно ненужный объект с new JSONObject(), а затем выбрасывает его. Также прекратите использовать get и после этого транслировать на JSONObject. Вместо этого объявите переменную, когда вы действительно хотите присвоить ей значение, и используйте getJSONObject. Также дайте вашим переменным осмысленные имена.

JSONObject title = members.getJSONObject("title");

Я думаю, что Jdk 8 может помочь ... плюс немного синтаксического сахара.

Итерируйте через JSONArray, передавая функцию для каждого объекта ... Таким образом, вам не нужно количество / длину.

JSONArray jsonArray = new JSONArray(response);
try {
    jsonArray.forEach(obj -> {                               //looping through the Array
        //All other things goes here... 
        });   
    } catch (JSONException j) {
        log.e("JSON 'PUFF' EXCEPTION", j.getMessage());
      }

Другие вопросы по теме