Vamshi Krishna
Vamshi Krishna

Reputation: 33

Android - Parsing JSON Data shows repeated results

I am trying to download data from the following https://d17h27t6h515a5.cloudfront.net/topher/2017/May/59121517_baking/baking.json

Here is my Android Code for downloading the data

public class DownloadTask extends AsyncTask {

private List<Ingredients> tIngredients = new ArrayList<>();
private List<Steps> tSteps = new ArrayList<>();

String result;

@Override
protected String doInBackground(String... params) {
    result = "";
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder().url("https://d17h27t6h515a5.cloudfront.net/topher/2017/May/59121517_baking/baking.json").build();
    try {
        result = client.newCall(request).execute().body().string();
        Log.i("RESULT", result);
        JSONArray rootArray = new JSONArray(result);
        for (int i = 0; i < rootArray.length(); i++) {
            JSONObject tempObject = rootArray.getJSONObject(i);
            JSONArray ingredients = tempObject.getJSONArray("ingredients");
          for(int j = 0 ; j< ingredients.length(); j++) {
                JSONObject tempIngredient = ingredients.getJSONObject(j);
                Ingredients newIngredient = new Ingredients(tempIngredient.getString("quantity"),
                        tempIngredient.getString("measure"),
                        tempIngredient.getString("ingredient"));
                tIngredients.add(newIngredient);
                j++;
            }
            JSONArray steps = tempObject.getJSONArray("steps");
            for (int k = 0; k < steps.length(); k++) {
                JSONObject tempStep = steps.getJSONObject(k);
                Steps newStep = new Steps(tempStep.getString("id"), tempStep.getString("shortDescription"),
                        tempStep.getString("description"), tempStep.getString("videoURL"));
                tSteps.add(newStep);
            }
            Recipe newRecipe = new Recipe(tempObject.getString("id"), tempObject.getString("name"), tempObject.getString("servings"), tIngredients, tSteps);
            MainActivity.mRecipies.add(newRecipe);

        }
    } catch (Exception e) {
        Log.i("TAG", e.getMessage());
    }

    return null;
}

@Override
protected void onPostExecute(String s) {


    for (int i = 0; i < MainActivity.mRecipies.size(); i++) {

        Log.i("Recipie Number", String.valueOf(i));
        for (int j = 0; j < MainActivity.mRecipies.get(i).getIngredients().size(); j++) {
            Log.i("Ingre  - ", MainActivity.mRecipies.get(i).getIngredients().get(j).getIngredient());

        }
        MainActivity.myList.setAdapter(MainActivity.myAdapter);
        super.onPostExecute(s);
    }
}

}

When i try to check the downloaded data, it shows repeated results and sometimes even strange results,

the logcat when printed..

    06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Recipie Number: 0
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: Mascapone Cheese(room temperature)
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: cream cheese(softened)
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: Bittersweet chocolate (60-70% cacao)
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: large eggs
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: all purpose flour
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: salt
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: sifted cake flour
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: baking powder
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla extract, divided
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: whole milk
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: egg whites
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: heavy cream
06-21 05:16:01.404 26656-26656/com.example.vamshi.baking I/Recipie Number: 1
06-21 05:16:01.404 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: Mascapone Cheese(room temperature)
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: cream cheese(softened)
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: Bittersweet chocolate (60-70% cacao)
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: large eggs
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: all purpose flour
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: salt
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: sifted cake flour
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: baking powder
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla extract, divided
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: whole milk
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: egg whites
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: heavy cream
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Recipie Number: 2
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: Mascapone Cheese(room temperature)
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: cream cheese(softened)
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: Bittersweet chocolate (60-70% cacao)
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: large eggs
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: all purpose flour
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: salt
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: sifted cake flour
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: baking powder
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla extract, divided
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: whole milk
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: egg whites
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: heavy cream
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Recipie Number: 3
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: Mascapone Cheese(room temperature)
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: cream cheese(softened)
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: Bittersweet chocolate (60-70% cacao)
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: large eggs
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: all purpose flour
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: salt
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: sifted cake flour
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: baking powder
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla extract, divided
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: whole milk
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: egg whites
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:16:01.408 26656-26656/com.example.vamshi.baking I/Ingre  -: heavy cream

Then i figured Maybe it was because i wasnt clearing the two arraylists this is the result when i add the clear commands for the two

Log.i("RESULT", result);
        JSONArray rootArray = new JSONArray(result);
        for (int i = 0; i < rootArray.length(); i++) {
            tIngredients.clear();
            tSteps.clear();
            JSONObject tempObject = rootArray.getJSONObject(i);
            JSONArray ingredients = tempObject.getJSONArray("ingredients");

The result is as follows

06-21 05:21:50.464 32625-32625/com.example.vamshi.baking I/Recipie Number: 0
06-21 05:21:50.464 32625-32625/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:21:50.464 32625-32625/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:21:50.464 32625-32625/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:21:50.464 32625-32625/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:21:50.464 32625-32625/com.example.vamshi.baking I/Ingre  -: heavy cream
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Recipie Number: 1
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: heavy cream
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Recipie Number: 2
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: heavy cream
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Recipie Number: 3
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: heavy cream

Please suggest why is this happening, thanks in advance.

Upvotes: 1

Views: 144

Answers (3)

OneCricketeer
OneCricketeer

Reputation: 191874

You do not need fields.

You want individual ingredients and steps per Recipe.

You may also want to look at Why does my ArrayList contain N copies of the last item added to the list?

    JSONArray rootArray = new JSONArray(result);
    // For each Recipe
    for (int i = 0; i < rootArray.length(); i++) {
        JSONObject tempObject = rootArray.getJSONObject(i);
        JSONArray jIngredients = tempObject.getJSONArray("ingredients");
        JSONArray jSteps = tempObject.getJSONArray("steps");

        // Get the ingredients
        List<Ingredients> ingredients = new ArrayList<>();
        for(int j = 0 ; j< jIngredients.length(); j++) {
            JSONObject tempIngredient = jIngredients.getJSONObject(j);
            Ingredients newIngredient = new Ingredients(tempIngredient.getString("quantity"),
                    tempIngredient.getString("measure"),
                    tempIngredient.getString("ingredient"));
            ingredients.add(newIngredient);
        }

        // Get the steps
        List<Steps> steps = new ArrayList<>();
        for (int j = 0; j < jSteps.length(); j++) {
            JSONObject tempStep = jSteps.getJSONObject(j);
            Steps newStep = new Steps(tempStep.getString("id"), tempStep.getString("shortDescription"),
                    tempStep.getString("description"), tempStep.getString("videoURL"));
            steps.add(newStep);
        }

        // Create the recipe
        Recipe newRecipe = new Recipe(tempObject.getString("id"), tempObject.getString("name"), tempObject.getString("servings"), ingredients, steps);
        MainActivity.mRecipies.add(newRecipe);
    }

Suggestions:

  • Retrofit
  • Gson
  • Not using static variables in your Activity class

Upvotes: 1

Ginder Singh
Ginder Singh

Reputation: 481

In doinbackground method in the second loop you are increasing j variable two times one in for loop j++ and then inside loop j++. Unless there you want to skipp ingredients you should remove j++ inside loop

Upvotes: 0

MS2099
MS2099

Reputation: 499

These two lines need to go inside your loop:

private List<Ingredients> tIngredients = new ArrayList<>();
private List<Steps> tSteps = new ArrayList<>();

Also, you second loop has an extra j++ Remove that.

Upvotes: 0

Related Questions