org.json.JSONException: нет значения для попытки проанализировать JSON

#java #android #json

#java #Android #json

Вопрос:

Привет всем, я пытаюсь разобрать json, но текст никогда не отображается! В logcat говорится следующее:

 06-24 23:28:22.681: W/System.err(6271): org.json.JSONException: No value for production_companies
06-24 23:28:22.681: W/System.err(6271):     at org.json.JSONObject.get(JSONObject.java:355)
06-24 23:28:22.682: W/System.err(6271):     at org.json.JSONObject.getJSONObject(JSONObject.java:574)
06-24 23:28:22.682: W/System.err(6271):     at com.example.movieinfo.MainActivity$MyAsyncTask.doInBackground(MainActivity.java:126)
06-24 23:28:22.682: W/System.err(6271):     at com.example.movieinfo.MainActivity$MyAsyncTask.doInBackground(MainActivity.java:1)
06-24 23:28:22.683: W/System.err(6271):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
06-24 23:28:22.683: W/System.err(6271):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
06-24 23:28:22.683: W/System.err(6271):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
06-24 23:28:22.684: W/System.err(6271):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
06-24 23:28:22.684: W/System.err(6271):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
06-24 23:28:22.685: W/System.err(6271):     at java.lang.Thread.run(Thread.java:841)
 

Я не знаю почему, но это мой код:

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
    getSupportActionBar().setCustomView(R.layout.actionbar);
    
    android.app.ActionBar bar = getActionBar();
    bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#3498db"))); 
    
    ImageView search = (ImageView) findViewById(R.id.search);
    box = (EditText) findViewById(R.id.editText1);
    search.setOnClickListener(new View.OnClickListener() {
        
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            url = "https://api.themoviedb.org/3/movie/"   box.getText().toString()   "?api_key=xxx";
            new MyAsyncTask().execute();
        }
    });
    
}

private class MyAsyncTask extends AsyncTask<String, String, String>{
     
    @Override
    protected String doInBackground(String... arg0) {
           
            //Creamos el cliente HTTP
            DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
           
            //Pasamos por POST la url
            HttpPost htppost = new HttpPost(url);
           
            //Definimos que tipo de dato nos pasan
            htppost.setHeader("Content-type", "application/json");
           
            //Leer data del URL
            InputStream inputStream = null;
           
            String result = null;
           
            try{
                    //Pedir una respuesta de la pagina
                    HttpResponse response = httpclient.execute(htppost);
                    //Guarda todo el contenido
                    HttpEntity entity = response.getEntity();
                    //Obtenog el contenido
                    inputStream = entity.getContent();
                    //Lee todo el contenido
                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
                    //Guarda todo ahi
                    StringBuilder theStringBuilder = new StringBuilder();
                   
                    String line = null;
                    //Aca leemos todo
                    while((line = reader.readLine()) != null){
                            theStringBuilder .append(line   "n");
                    }
                    //Pasamos todo a result
                    result = theStringBuilder.toString();
                   
            }catch(Exception e){
                   
                    e.printStackTrace();
                   
            }finally{
                   
                    try{
                            //Si se guardo algo cerramos el input stream
                            if(inputStream != null){
                                    inputStream.close();
                            }else{
                                    Log.e("No funciono", "Cerrar el inputStream");
                            }
                           
                    }catch(Exception e){                                   
                            e.printStackTrace();                                   
                    }
                   
            }
           
            JSONObject jsonObject;
            try{
                    // Hacemos que el resultado sea un JSONObject
                    jsonObject = new JSONObject(result);
                    // Buscamos el objeto query "Objeto"
                    JSONObject queryJSONOBject = jsonObject.getJSONObject("production_companies");
                    // Finalmente obtenemos los strings
                    titulo = jsonObject.getString("original_title");
                    descripcion = queryJSONOBject.getString("name");
                    imageUrl = jsonObject.getString("poster_path");
                   
            }catch(JSONException e){
                    e.printStackTrace();
            }
           
           
            return resu<
    }
   
    @Override
    protected void onPostExecute(String result) {
            Toast.makeText(getApplicationContext(), titulo, Toast.LENGTH_SHORT).show();
            TextView line1 = (TextView) findViewById(R.id.titulo);
            TextView line2 = (TextView) findViewById(R.id.descr);
            line1.setText(titulo);
            line2.setText(descripcion);
    }

}
 

Это будет json

 {
"adult": false,
  "backdrop_path": "/h5ILYBMAYAlZbMypIImmSr2NGqZ.jpg",
"belongs_to_collection": null,
"budget": 6000000,
"genres": [
  {
    "id": 35,
    "name": "Comedy"
  },
  {
    "id": 18,
    "name": "Drama"
  },
  {
    "id": 14,
    "name": "Fantasy"
  }
],
"homepage": "http://www.lasciencedesreves-lefilm.com/accueil.htm",
"id": 300,
"imdb_id": "tt0354899",
"original_title": "La science des rêves",
"overview": "A man entranced by his dreams and imagination is lovestruck with a French woman and feels he can show her his world.",
"popularity": 0.991891956045027,
"poster_path": "/8juTRqn5o43mnlVacp1IzZSd11N.jpg",
"production_companies": [
  {
    "name": "Partizan Films",
    "id": 11911
  },
  {
    "name": "Gaumont",
    "id": 9
  },
  {
    "name": "France 3 Cinéma",
    "id": 591
  },
  {
    "name": "Canal ",
    "id": 5358
  },
  {
    "name": "TPS Star",
    "id": 6586
  },
  {
    "name": "Mikado Film",
    "id": 11912
  }
],
"production_countries": [
  {
      "iso_3166_1": "FR",
    "name": "France"
  },
  {
    "iso_3166_1": "IT",
    "name": "Italy"
  }
],
"release_date": "2006-02-11",
  "revenue": 9524340,
"runtime": 105,
"spoken_languages": [
{
  "iso_639_1": "en",
  "name": "English"
},
{
  "iso_639_1": "es",
  "name": "Español"
},
{
  "iso_639_1": "fr",
  "name": "Français"
}
],
"status": "Released",
"tagline": "Close your eyes. Open your heart.",
"title": "The Science of Sleep",
"vote_average": 7.7,
"vote_count": 27
 }
 

Если бы кто-нибудь мог сказать мне, что не так, это было бы оценено.

Комментарии:

1. анализатор JSON не может найти допустимый объект для ключа «production_companies», вы уверены, что он присутствует в вашем JSON?

2. В вашем результате есть все строки. Вы прочитали свой ответ и проанализировали его в строку и сохранили в результате, если я не ошибаюсь. вместо этого попробуйте получить его в виде строки.

Ответ №1:

попробуйте следующий код :-

     try
    {
        JSONObject jsonObject = new JSONObject(result);
        // Buscamos el objeto query "Objeto"
        JSONArray queryJSONOBject = jsonObject.getJSONArray("production_companies");
        // Finalmente obtenemos los strings
        String descripcion = "" ;//= new String[queryJSONOBject.length()];
        for (int i = 0; i < queryJSONOBject.length(); i  )
        {
            JSONObject j = queryJSONOBject.getJSONObject(i);
            descripcion = descripcion   j.getString("name")  " / ";
        }
        String titulo = jsonObject.getString("original_title");
        String imageUrl = jsonObject.getString("poster_path");

        System.out.println(titulo);
        System.out.println(imageUrl);
        System.out.println(descripcion);
    }
    catch (Exception e)
    {
        // TODO: handle exception
    }
 

Дело в том, что данные о ваших компаниях-производителях поступают из массива json, и вы обрабатывали данные о компаниях-производителях как объект json.

Ответ №2:

production_companies это JSONArray не a JSONObject , и поэтому анализатор правильно сообщает вам, что JSONObject для ключа нет production_companies

Комментарии:

1. Спасибо !!!, но он не показывает titulo = JSONObject.getString(«original_title»); далее, вы знаете почему?

2. поскольку предыдущая строка (JSONObject queryJSONOBject = JSONObject.getJSONObject(«production_companies»); ) выдает исключение, поэтому весь код после нее, который находится в блоке try / catch, будет перешагнут. Используйте отладчик и просмотрите код, чтобы увидеть, что происходит

3. Я попытался подавить эту строку, и что-то произошло

4. используйте отладчик и выполните пошаговый код, чтобы выяснить, что происходит не так

Ответ №3:

Как только вы получили inputstream, преобразуйте его в строку. После преобразования строки проверьте, существует ли какой-либо тег jason в строку. Если существует, то проанализируйте данные json.

Комментарии:

1. Ваш ответ имел смысл для меня только после 3-кратного его прочтения, и он не отвечает на вопрос, а именно, почему вызов getJSONObject завершается с ошибкой.