Как парсить JSON с помощью GSON?
Есть JSON-чик, который надо запарсить - https://api.openweathermap.org/data/2.5/weather?q=Тюмень&appid=83623663100b56b2e64fa7b514835b7f&units=metric:
{"coord":{"lon":65.5272,"lat":57.1522},
"weather":
[{"id":620,"main":"Snow","description":"light shower snow","icon":"13d"}],
"base":"stations","main":
{"temp":-3.28,"feels_like":-10.2,"temp_min":-3.28,"temp_max":-2.95,"pressure":1006,"humidity":86},
"visibility":9000,
"wind":{"speed":7.15,"deg":80,"gust":12.07},
"clouds":
{"all":100},
"dt":1698652392,
"sys":
{"type":2,"id":2086898,"country":"RU","sunrise":1698633772,"sunset":1698667206},
"timezone":18000,
"id":1488754,
"name":"Tyumen",
"cod":200}
Надо достать из "main": "temp", "temp_min", "temp_max"
Код MainActivity:
package com.example.learnkotlin
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val temperature: TextView = findViewById(R.id.temperature)
val minTemperature: TextView = findViewById(R.id.min_temperature)
val maxTemperature: TextView = findViewById(R.id.max_temperature)
val response: Response = com.google.gson.Gson().fromJson(
"https://api.openweathermap.org/data/2.5/weather?q=Тюмень&appid=83623663100b56b2e64fa7b514835b7f&units=metric",
object : com.google.gson.reflect.TypeToken<Response>() {}.type
)
temperature.text = response.main.temp
minTemperature.text = response.main.temp_min
maxTemperature.text = response.main.temp_max
}
}
class Response(
val main: Main,
)
class Main(
val temp: String,
val temp_min: String,
val temp_max: String,
)
Приложение вылетает при запуске, библиотеку Gson в Gradle прописал.\
Код build.gradle.kts:
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "com.example.learnkotlin"
compileSdk = 34
defaultConfig {
applicationId = "com.example.learnkotlin"
minSdk = 24
targetSdk = 0
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.10.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
implementation ("io.reactivex.rxjava2:rxjava:2.1.7")
implementation ("io.reactivex.rxjava2:rxandroid:2.0.1")
implementation ("io.reactivex.rxjava2:rxkotlin:2.2.0")
implementation ("com.google.code.gson:gson:2.10.1")
}
Логи:
2023-10-30 16:17:30.139 14498-14498 AndroidRuntime com.example.learnkotlin E FATAL EXCEPTION: main
Process: com.example.learnkotlin, PID: 14498
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.learnkotlin/com.example.learnkotlin.MainActivity}: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3645)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:138)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7959)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:942)
Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:397)
at com.google.gson.Gson.fromJson(Gson.java:1227)
at com.google.gson.Gson.fromJson(Gson.java:1137)
at com.google.gson.Gson.fromJson(Gson.java:1047)
at com.google.gson.Gson.fromJson(Gson.java:1014)
at com.example.learnkotlin.MainActivity.onCreate(MainActivity.kt:16)
at android.app.Activity.performCreate(Activity.java:8348)
at android.app.Activity.performCreate(Activity.java:8327)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1423)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3626)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:138)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7959)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:942)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:393)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:386)
at com.google.gson.Gson.fromJson(Gson.java:1227)
at com.google.gson.Gson.fromJson(Gson.java:1137)
at com.google.gson.Gson.fromJson(Gson.java:1047)
at com.google.gson.Gson.fromJson(Gson.java:1014)
at com.example.learnkotlin.MainActivity.onCreate(MainActivity.kt:16)
at android.app.Activity.performCreate(Activity.java:8348)
at android.app.Activity.performCreate(Activity.java:8327)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1423)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3626)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:138)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7959)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:942)