在android中创建JSON对象失败

时间:2014-02-25 19:42:24

标签: android json

我有一个使用外部电影API的Android应用程序,以便通过HTTP请求获取电影的内容。

在服务更改用于电影查询的域之前,每件事情都很顺利,我无法创建JSON对象来获取收到的响应内容。

以下是完成工作的代码片段(它在更改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);

以下是日志的日志cat剪辑:

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

会出现什么问题? 顺便说一句,以前的网址是:http://mymovieapi.com

这是将JSONArray编辑为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 个答案:

答案 0 :(得分:2)

您收到的是JsonObject,而不再是JsonArray!

更改您的代码:

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

有:

JSONObject jo = new JSONObject(res);

这应该有用!

答案 1 :(得分:1)

替换

JSONArray ja = new JSONArray(res);

JSONObject movie = new JSONObject(res);

因为你的JSON字符串就是这个。

{"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

答案 2 :(得分:1)

<强>更新

这对我来说很好:http://rextester.com/live/ZKUZ3520

您应该在代码中解析要附加到URI的文本:

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

如果您输入“True Grit”等内容,则会回复 404

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

因为您省略了空格,因此(%20

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

此外,请确保在收到JSON后正确反序列化:

如Rajesh CP所述,您使用的旧API标准显然使用了Array而不是Object。因此,将JSONArray ja = new JSONArray(res);替换为JSONObject movie = new JSONObject(res);


这是我在删除JSON反序列化后想出的代码,试图将问题稍微隔离一下。这将正确地从服务器获取JSON而没有错误。

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());
}