###http接続を用いてライブドアの天気情報を取得したい
書籍を参考にKotlinとAndroidアプリ開発の勉強をしています。Http通信を使ってlivedoorから天気情報を取得して表示させるサンプルアプリケーションを作成していました。ライブドアから取得したレスポンスデータをJSON文字列に変換し、そのJSON文字列からJSONオブジェクトを生成するJSONObject(result)
の部分でorg.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject
とエラーがでてアプリケーションが落ちてしまいます。ライブドアから天気情報を取得する非同期処理部分のソースとエラー内容は下記の通りです。
ライブドアから天気情報を取得する非同期処理部分。
Kotlin
1 private inner class WeatherInfoReceiver(): AsyncTask<String,String,String>(){ 2 override fun doInBackground(vararg params: String?): String { 3 val id = params[0] 4 5 //id=270000を与えて大阪の天気情報を取得する。 6 val urlStr = "http://weather.livedoor.com/forecast/webservice/json/v1?city=${id}" 7 8 val url = URL(urlStr) 9 10 val con = url.openConnection() as HttpURLConnection 11 12 con.requestMethod = "GET" 13 14 con.connect() 15 16 //レスポンデータを受け取る 17 val stream = con.inputStream 18 19 //レスポンスデータをJSON文字列へ変換する 20 val result = is2String(stream) 21 22 con.disconnect() 23 stream.close() 24 return result 25 } 26 27 override fun onPostExecute(result: String?) { 28 29 //JSON文字列からJSONオブジェクトを生成する。 30 val rootJSON = JSONObject(result) //←ここでアプリケーションが落ちる。 31 32 val descriptionJSON = rootJSON.getJSONObject("description") 33 val desc = descriptionJSON.getString("text") 34 35 val forecasts = rootJSON.getJSONArray("forecasts") 36 val forecastsNow = forecasts.getJSONObject(0) 37 val telop = forecastsNow.getString("telop") 38 39 val tvWeatherTelop = findViewById<TextView>(R.id.tvWeatherTelop) 40 val tvWeatherDesc = findViewById<TextView>(R.id.tvWeatherDesc) 41 tvWeatherTelop.text = telop 42 tvWeatherDesc.text = desc 43 } 44 45 private fun is2String(stream: InputStream):String{ 46 val sb = StringBuilder() 47 val reader = BufferedReader(InputStreamReader(stream,"UTF-8")) 48 var line = reader.readLine() 49 while (line != null){ 50 sb.append(line) 51 line = reader.readLine() 52 } 53 reader.close() 54 return sb.toString() 55 } 56 }
↑ソースの全文はこちらの質問者様と同じですがメインアクティビティの方は関係ないと思いたいので省略します。
エラー内容。
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.websarva.wings.android.asyncsample, PID: 9951 java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:503) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject at org.json.JSON.typeMismatch(JSON.java:112) at org.json.JSONObject.<init>(JSONObject.java:163) at org.json.JSONObject.<init>(JSONObject.java:176) at com.websarva.wings.android.asyncsample.MainActivity$WeatherInfoReceiver.onPostExecute(MainActivity.kt:87) at com.websarva.wings.android.asyncsample.MainActivity$WeatherInfoReceiver.onPostExecute(MainActivity.kt:62) at android.os.AsyncTask.finish(AsyncTask.java:695) at android.os.AsyncTask.access$600(AsyncTask.java:180) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:712) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
###ブレークポイントでデータを見た
ブレークポイントで止めてみたJSON文字列(result)の中身です。
<!DOCTYPE html><html lang="ja"><head><!-- Google Tag Manager --><script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d//以下略
文字列の頭はcannot be convertedで言われている<!DOCTYPE html>
から始まっています。また、"descripiton"という情報はありましたが"forecasts","telop"という情報がありませんでした。やはり受け取ったデータ自体が間違っているのでしょうか。
###質問したいこと
なぜcannot be convertedが出てしまうのでしょうか?
ライブドアから取得したレスポンスデータがそもそも間違っているのでしょうか?
レスポンスデータをJSON文字列に変えたところで間違っているのでしょうか?
それとももっと初歩的なスペルミスや工程の抜けがあるのでしょうか?
恥ずかしながらどのタイミングでダメなのか見当がつきません。何かわかる方が居ましたらよろしくお願いします。
###環境
Android Studio 4.1.1
AndroidEmulator Nexus_5X_API_28
回答1件
あなたの回答
tips
プレビュー