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