OpenWeatherMap APIを使用すると、この例外エラーが発生します。 resultをJSONObjectにしようとしていますが、-nullが増え続けています。
@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();
}
}
JSONデータは問題なく取り込まれますが、JSONObjectになることだけが必要ですが、null部分がキャッチされます。なぜそれが起こっているのでしょうか?
また、サイトからJSON Response
入ってくる:
{"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],.....}
なぜ最初はnullがないのですか?ご協力ありがとうございました。
あなたが受け取るデータで天気はJSONArrayです。
これを試して :
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){
}
サーバーから返された結果がnull
で始まる場合は、この例外org.json.JSONException: Value null of type org.json.JSONObject$1 cannot be converted to JSONObject
。
これは、この結果が有効なJSONコンテンツではないためです。
サーバーからこの無効なコンテンツを実際に受け取った場合の回避策は、JSONを解析する前にnull
を削除することです。
String crappyPrefix = "null";
if(result.startsWith(crappyPrefix)){
result = result.substring(crappyPrefix.length(), result.length());
}
JSONObject jo = new JSONObject(result);
これを試してください(私にとってはうまくいきました)。同じ問題が発生していました
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;
}
これを試して、
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();
}
エラーは、JSONが無効であることを意味しますおそらく
JSON形式 ここ をテストできます。
しかし、コードの問題は、ここでgetString()を使用しようとしていることです
String weatherInfo = jsonObject.getString("weather");
天気は実際にはJSONArrayですが、文字列として使用する場合は
String weatherInfo = jsonObject.getJSONArray("weather").toString();