質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

6328閲覧

JSONObject(String)でcannot be convertedが出てしまう理由、対処法が知りたいです。

n3mryo

総合スコア1

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/01/03 03:00

###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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/01/03 03:59

<!DOCTYPE html> で始まるってことは JSON ではなく HTML が返ってきてるってことです。 livedoor 天気はサービス終了したみたいですね。とりあえず互換 API を使わせていただいては? https://weather.tsukumijima.net/
n3mryo

2021/01/03 14:33 編集

そういうことなんですね! そちらのURLで試したところ(おそらく)JSONファイルが返ってきて想定通りの動きをしてくれました。ありがとうございます。私一人では知りえなかった情報で非常に助かりました! またJSONファイルがどんなものかも勉強していきます^_^
guest

回答1

0

自己解決

hoshi-takanoriさんに教えていただいた互換APIを使用したところ解決しました。ありがとうございます。

投稿2021/01/03 14:41

n3mryo

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問