1

I have an android application that use an external movies API in order to get content of a movie via HTTP request.

Every thing was going fine until the service change the domain used for movies queries , I can't create the JSON object to fetch the received content of the response into it.

Here is the snip of the code that do the work (it was working properly before they change the URL)

try {
    Add.setEnabled(true);
    movieContent.setText("");

    URL url = new URL("http://www.omdbapi.com/?i=&t=" + searchET.getText().toString());
    Log.d("URL content", url.toString());
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    Log.d("URL content", "register URL");
    urlConnection.connect();
    Log.d("URL connection", "establish connection");
    String res = null;
    BufferedReader reader = new BufferedReader(
        new InputStreamReader(urlConnection.getInputStream()));
        Log.d("stream buffer", "read the stream");
        StringBuilder sb = new StringBuilder();
        String line = "";

        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        res = sb.toString();
        Log.d("movie content", res);

        JSONArray ja = new JSONArray(res);
        Log.d("JSON array", "created");
        JSONObject jo = ja.getJSONObject(0);

and here is the log cat snip of the logs:

02-25 21:28:42.287: D/Username passed(32500): joker
02-25 21:28:42.295: D/USERFINALSESSION(32500): 2
02-25 21:28:53.311: V/ViewRoot(32500): BACK _  IME finished event: seq=1, handled=true,  action=0c4s158
02-25 21:28:53.311: V/ViewRoot(32500): BACK _  IME finished mView : com.android.internal.policy.impl.PhoneWindow$DecorView@405488f0
02-25 21:28:53.436: V/ViewRoot(32500): BACK _  IME finished event: seq=2, handled=true,  action=1c4s158
02-25 21:28:53.436: V/ViewRoot(32500): BACK _  IME finished mView : com.android.internal.policy.impl.PhoneWindow$DecorView@405488f0
02-25 21:28:59.873: D/URL content(32500): http://www.omdbapi.com/?i=&t=ted
02-25 21:28:59.889: D/URL content(32500): register URL
02-25 21:29:02.037: D/URL connection(32500): establish connection
02-25 21:29:03.608: D/stream buffer(32500): read the stream
02-25 21:29:03.615: D/movie content(32500): {"Title":"Ted","Year":"2012","Rated":"R","Released":"29 Jun 2012","Runtime":"106 min","Genre":"Comedy, Fantasy","Director":"Seth MacFarlane","Writer":"Seth MacFarlane (screenplay), Alec Sulkin (screenplay), Wellesley Wild (screenplay), Seth MacFarlane (story)","Actors":"Mark Wahlberg, Mila Kunis, Seth MacFarlane, Joel McHale","Plot":"As the result of a childhood wish, John Bennett's teddy bear, Ted, came to life and has been by John's side ever since - a friendship that's tested when Lori, John's girlfriend of four years, wants more from their relationship.","Language":"English","Country":"USA","Awards":"Nominated for 1 Oscar. Another 6 wins & 21 nominations.","Poster":"http://ia.media-imdb.com/images/M/MV5BMTQ1OTU0ODcxMV5BMl5BanBnXkFtZTcwOTMxNTUwOA@@._V1_SX300.jpg","Metascore":"62","imdbRating":"7.1","imdbVotes":"315,192","imdbID":"tt1637725","Type":"movie","Response":"True"}
02-25 21:29:03.748: D/dalvikvm(32500): GC_CONCURRENT freed 177K, 47% free 3041K/5639K, external 2311K/2882K, paused 4ms+5ms
02-25 21:29:03.748: D/Cursor(32500): Database path: moviesGeeks
02-25 21:29:03.748: D/Cursor(32500): Table name   : watched
02-25 21:29:03.748: D/Cursor(32500): Database path: moviesGeeks
02-25 21:29:03.748: D/Cursor(32500): Table name   : users

what would be the problem ? by the way the former URL was :http://mymovieapi.com

here is the code after edit the JSONArray into JSONObject: @Dayan

res = sb.toString();
                Log.d("movie content", res);

                /*JSONArray ja = new JSONArray(res);
                Log.d("JSON array", "created");
                JSONObject jo = ja.getJSONObject(0);*/
                JSONObject jo= new JSONObject(res);
                st = "Title : " + jo.getString("Title");
                movie[0] = st;
                st = null;
                Log.d("JSON", movie[0]);

                st = "Directors : \n" +jo.getString("Director");
                movie[1] = st;
                st = null;
                Log.d("JSON", movie[1]);
                st = "Actors : \n"+ jo.getString("Actors");
                movie[2] = st;
                st = null;
                Log.d("JSON", movie[2]);
                st = "Runtime : " + jo.getString("Runtime");
                movie[3] = st;
                st = null;
                Log.d("JSON", movie[3]);
                st = "Release Year : " + jo.getString("Released");
                movie[4] = st;
                st = null;
                Log.d("JSON", movie[4]);
                st = "Rating : " + jo.getString("imdbRating");
                movie[5] = st;
                st = null;
                Log.d("JSON", movie[5]);
                st = "Description : \n" + jo.getString("Plot");
                movie[6] = st;
                st = null;
                Log.d("JSON", movie[6]);
                Log.d("before appending", movie[6] + "");
                for (int i = 0; i < movie.length - 1; ++i) {
                    movieContent.append(movie[i] + "\n\n");
                }

                imageURL = jo.getString("Poster");
                movie[7] = imageURL;
                Log.d("image url", movie[7] + "");
                // added jafar alali
                // write Json content to a file
                int c = 0;
                for (String content : movie) {
                    if (c == 0) {
                        writefileInitial();
                        c++;
                    }
                    writeJsonFile(content, JsonFileToread);
                }
                try {
                    Bitmap bitmap = BitmapFactory
                            .decodeStream((InputStream) new URL(imageURL)
                                    .getContent());
                    moviePoster.setImageBitmap(bitmap);
                } catch (MalformedURLException e) {
                    // TODO: handle exception
                    Log.d("poster", movie[7] + "");
                } catch (IOException e) {
                    e.printStackTrace();
                    // TODO: handle exception
                }

                Add.setVisibility(View.VISIBLE);
                addtolist.setVisibility(View.VISIBLE);

            } catch (JSONException e) {
                // TODO Auto-generated catch block
                movieContent.setText("Film not found");
                moviePoster.setImageBitmap(null);
                Add.setVisibility(View.GONE);
                addtolist.setVisibility(View.GONE);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                movieContent.setText("Error in Connection");
                moviePoster.setImageBitmap(null);
                Add.setVisibility(View.GONE);
                addtolist.setVisibility(View.GONE);
            }

            catch (Exception e) {
                movieContent.setText("Exception");
                moviePoster.setImageBitmap(null);
                Add.setVisibility(View.GONE);
                addtolist.setVisibility(View.GONE);
            }
            // extract file content into a movie object to be inserted
            movies tempMovie = new movies();
            tempMovie.setTitle(movie[0]);
            tempMovie.setDirector(movie[1]);
            tempMovie.setActors(movie[2]);
            tempMovie.setRuntime(movie[3]);
            tempMovie.setYear(movie[4]);
            tempMovie.setGrate(movie[5]);
            tempMovie.setDescription(movie[6]);
            tempMovie.setURL(movie[7]);
            // insert movie into data base
            // send object to data base movie inserter
            try {
                dbm.addMovie(tempMovie);

            } catch (Exception e1) {
                // TODO Auto-generated catch block
                Toast tt = Toast.makeText(HomePage.this,
                        "Insertion failed", 3000);
                tt.setGravity(Gravity.CENTER, 0, 0);
                tt.show();
            }

        }

    });
3
  • Please post the full Stacktrace when you catch that IOException you were referring to in the comments under my answer. Commented Feb 25, 2014 at 21:03
  • Also, if you don't mind, please show us the full method where this code is found, and not just the snippet as you currently have it. Commented Feb 25, 2014 at 21:04
  • @Dayan of course i don't mind , i will update the question right now Commented Feb 25, 2014 at 21:08

3 Answers 3

2

You are receiving a JsonObject in return and no more the JsonArray!

Change your code:

JSONArray ja = new JSONArray(res);
Log.d("JSON array", "created");
JSONObject jo = ja.getJSONObject(0);

for:

JSONObject jo = new JSONObject(res);

That should work!

Sign up to request clarification or add additional context in comments.

1 Comment

Could you post the code below the line JSONObject jo = ja.getJSONObject(0);?
1

Update

This works fine for me : http://rextester.com/live/ZKUZ3520

You should parse the text you are appending to the URI in your code:

    URL url = new URL("http://www.omdbapi.com/?i=&t=" + searchET.getText().toString());

If you enter something such as "True Grit" it will respond with a 404:

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 400 for URL: http://www.omdbapi.com/?t=True Grit

Because you are omitting the space, hence (%20)

http://www.omdbapi.com/?t=True%20Grit 

Also, make sure to properly deserialize your JSON when received:

As stated by Rajesh CP, you are using the old API standard which apparently made used of Array instead of Object. So replace JSONArray ja = new JSONArray(res); with JSONObject movie = new JSONObject(res);


Here is the code I came up with after removing the JSON Deserialize to try and isolate the problem a bit more. This will properly fetch the JSON from the server without errors.

public static void main(String args[]) throws IOException 
{
        URL url = new URL("http://www.omdbapi.com/?i=&t=True%20Grit");

        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        urlConnection.connect();

        BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));

            StringBuilder sb = new StringBuilder();
            String line = "";

            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }

            System.out.println(sb.toString());
}

4 Comments

thank u , i know about the issue o entering a title with spaces , i'll consider it once it work with a single word title , i've did as you all said i've change the Json array into Json object but it also didnt work notice that before i edit the code it was triggering JSONException but now after the edit and with the use of JSON object it triggers IOException
@JafarAlali92 Please update your method to handle the IOException (throws IOException) and see if you can update your question with the full Stacktrace that you get.
@JafarAlali92 I pasted your code here (rextester.com/live/ZKUZ3520) and removed the JSON Deserializer to isolate the issue; its working fine. Take a look.
yes i know , it's just get stuck in the JSONObject i don't know why , it's weird everything seem fine
1

Replace

JSONArray ja = new JSONArray(res);

With

JSONObject movie = new JSONObject(res);

Since your JSON String is this.

{"Title":"Ted","Year":"2012","Rated":"R","Released":"29 Jun 2012","Runtime":"106 min","Genre":"Comedy, Fantasy","Director":"Seth MacFarlane","Writer":"Seth MacFarlane (screenplay), Alec Sulkin (screenplay), Wellesley Wild (screenplay), Seth MacFarlane (story)","Actors":"Mark Wahlberg, Mila Kunis, Seth MacFarlane, Joel McHale","Plot":"As the result of a childhood wish, John Bennett's teddy bear, Ted, came to life and has been by John's side ever since - a friendship that's tested when Lori, John's girlfriend of four years, wants more from their relationship.","Language":"English","Country":"USA","Awards":"Nominated for 1 Oscar. Another 6 wins & 21 nominations.","Poster":"http://ia.media-imdb.com/images/M/MV5BMTQ1OTU0ODcxMV5BMl5BanBnXkFtZTcwOTMxNTUwOA@@._V1_SX300.jpg","Metascore":"62","imdbRating":"7.1","imdbVotes":"315,192","imdbID":"tt1637725","Type":"movie","Response":"True"}

{ -----> Represents JSONObject 
[ -----> Represents JSONArray

1 Comment

it sounds logical , but it's not working so , i've did as you told me

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.