web-dev-qa-db-fra.com

La valeur null de type org.json.JSONObject $ 1 ne peut pas être convertie en JSONObject

Je reçois cette erreur d'exception lors de l'utilisation de l'API OpenWeatherMap. J'essaie simplement de faire en sorte que le result soit un JSONObject, mais null continue de s'afficher.

@Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        // What's coming in as result...
        // Printed to the console...
        // null{"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":800,"main":"Clear",
        // "description":"clear sky","icon":"01d"}],...}


        try {
            JSONObject jsonObject = new JSONObject(result);
            String weatherInfo = jsonObject.getString("weather");

            Log.i("Weather Info", weatherInfo);
        } catch (JSONException e) {
            e.printStackTrace();
        }

   }

Les données JSON entrent bien mais tout ce que je veux, c’est de devenir un objet JSON, mais la partie nulle est capturante. Des idées pourquoi cela pourrait se produire?

Également sur le site, le JSON Response entrant est:

{"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],.....}

Comment se fait-il qu'il n'y ait pas de null au début? Merci de votre aide.

6
SmiffyKmc

Dans les données que vous recevez weather est un JSONArray.

Essaye ça :

 String json = "{\"coord\":{\"lon\":-0.13,\"lat\":51.51},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01d\"}],.....}";

try{
    JSONObject jo = new JSONObject(json);
    JSONArray weather = jo.getJSONArray("weather");
    for(int i = 0;i < weather.length(); i++){
        JSONObject w = weather.getJSONObject(i);
        String main = w.getString("main");
        String description = w.getString("description");
        //...
    }
}catch (Exception e){

}

Comme vous l'avez dit, si le résultat renvoyé par le serveur commence par null, vous aurez cette exception org.json.JSONException: Value null of type org.json.JSONObject$1 cannot be converted to JSONObject

En effet, ce résultat n'est pas un contenu JSON valide.

Si vous recevez réellement ce contenu non valide du serveur, une solution de contournement peut consister à supprimer null avant d'analyser le JSON.

String crappyPrefix = "null";

if(result.startsWith(crappyPrefix)){
    result = result.substring(crappyPrefix.length(), result.length());
}
JSONObject jo = new JSONObject(result);
6
Nirekin

Essayez ceci (a fonctionné pour moi) .. J'avais le même problème

public class DownloadData extends AsyncTask<String , Void, String >{

        HttpURLConnection httpURLConnection =null;
        URL url;


String resultString="";  <------- instead of setting it to null


        @Override
        protected String doInBackground(String... urls) {


            try {
                url = new URL(urls[0]);
                httpURLConnection = (HttpURLConnection) url.openConnection();
                InputStream is = httpURLConnection.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                int data = isr.read();
                while(data != -1){
                    char ch = (char) data;
                    resultString += ch;
                    data = isr.read();

                }
                return resultString;



            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


            return null;
        }
3
Amit

essaye ça,

JSONObject jsonObject = new JSONObject(result);
        try {
            JSONArray jsonArray = jsonObject.getJSONArray("weather");

            for(int i=0;i<jsonArray.length();i++){
                JSONObject object=jsonArray.getJSONObject(i);
                String main =object.getString("main");
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
1
Pradeep Gupta

parfois, le problème est que votre réponse est nulle mais que vous attendez un objet JSON. sa résolution pour le résoudre côté serveur.Si vous ne pouvez pas éditer le code côté serveur ci-dessous, les réponses peuvent être utiles

Comment tester si un objet JSON est nul ou n'existe pas

Gérer une réponse vide dans un JSONRequest with Volley

1
masoud

L'erreur signifie que votre JSON n'est pas valide probabaly

Vous pouvez tester votre format JSON ici

Mais le problème dans votre code est que vous essayez d'utiliser getString () ici

String weatherInfo = jsonObject.getString("weather");

Alors que le temps est réellement JSONArray, si vous le voulez comme chaîne utiliser

String weatherInfo = jsonObject.getJSONArray("weather").toString();
0