从json(kotlin android)获取天气结果

从json(kotlin android)获取天气结果,android,json,kotlin,Android,Json,Kotlin,我试图从json中得到一些结果,但我有一个问题。当我只有这行代码时,它可以工作,我可以得到温度 var main: TemperatureData? = null 但是我也想从json中获得更多的值,所以我插入了这行代码 var weather: WeatherDataJson? = null 当我添加第二行时,它不获取任何数据(它甚至停止获取var main:…数据) 这是我的天气数据课 class WeatherData { var main: TemperatureData?

我试图从json中得到一些结果,但我有一个问题。当我只有这行代码时,它可以工作,我可以得到温度

var main: TemperatureData? = null
但是我也想从json中获得更多的值,所以我插入了这行代码

var weather: WeatherDataJson? = null
当我添加第二行时,它不获取任何数据(它甚至停止获取var main:…数据)

这是我的天气数据课

class WeatherData {
    var main: TemperatureData? = null
    var weather: WeatherDataJson? = null

}
这是我的接口类

interface ApiInterface {
    @GET("data/2.5/weather?q=Prague")
    fun getWeatherData(@Query("appid") appId: String)
            : Call<WeatherData>

}
还有我的WeatherDataJson类

data class WeatherDataJson(var description:String)
在我的main类中,我有一个将json显示到屏幕中的函数,但我无法加载“var weather…” 下面是函数

private fun getTemperatureData(repository: Repository) {
        repository.getApiInterface()
                .getWeatherData("4cf7f6610d941a1ca7583f50e7e41ba3")
                .enqueue(object : Callback<WeatherData> {
                    override fun onFailure(call: Call<WeatherData>?, t: Throwable?) {
                        t?.printStackTrace()
                    }

                    override fun onResponse(call: Call<WeatherData>?, response: Response<WeatherData>?) {
                        val weatherData: WeatherData? = response?.body()
                        weatherData?.let {
                            it.main?.let {
                                tempText.text = it.temp
                            }
                            it.weather?.let{
                                weatherTextFromApi.text=it.description
                            }
                        }
                    }
                })
    }
private fun getTemperatureData(存储库:存储库){
repository.getapinterface()
.getWeatherData(“4cf7f6610d941a1ca7583f50e7e41ba3”)
.enqueue(对象:回调{
覆盖失效时的乐趣(调用:调用?、t:可丢弃?){
t?.printStackTrace()
}
覆盖fun onResponse(调用:调用?,响应:响应?){
val weatherData:weatherData?=响应?.body()
天气数据?让我们看看{
它,梅因?,让我来{
testext.text=it.temp
}
天气怎么样?让我来吧{
weatherTextFromApi.text=it.description
}
}
}
})
}

说明上,is表示未解析的引用说明

来自OpenWeatherMap的服务器响应返回的是一个JSON数组,而不是一个JSON对象,用于
天气
。Gson/改造无法自动将数组转换为单个对象,因此您需要更改数据类以保存列表(或使用自定义Gson反序列化器并手动从数组中获取所需的项)

您的顶级课程应该是什么样的示例:

class WeatherData {
    var main: TemperatureData? = null
    var weather: List<WeatherDataJson>? = null
}
class天气数据{
var main:TemperatureData?=null
变量天气:列表?=null
}

如果使用OpenWeatherMapAPI,请声明这些数据类

data class WeatherData(
    @SerializedName("coord") val coord: Coord,
    @SerializedName("weather") val weather: List<Weather>,
    @SerializedName("base") val base: String,
    @SerializedName("main") val main: TemperatureData,
    @SerializedName("visibility") val visibility: Int,
    @SerializedName("wind") val wind: Wind,
    @SerializedName("clouds") val clouds: Clouds,
    @SerializedName("dt") val dt: Int,
    @SerializedName("sys") val sys: Sys,
    @SerializedName("id") val id: Int,
    @SerializedName("name") val name: String,
    @SerializedName("cod") val cod: Int
)

data class Sys(
    @SerializedName("type") val type: Int,
    @SerializedName("id") val id: Int,
    @SerializedName("message") val message: Double,
    @SerializedName("country") val country: String,
    @SerializedName("sunrise") val sunrise: Int,
    @SerializedName("sunset") val sunset: Int
)

data class Coord(
    @SerializedName("lon") val lon: Double,
    @SerializedName("lat") val lat: Double
)

data class TemperatureData(
    @SerializedName("temp") val temp: Double,
    @SerializedName("pressure") val pressure: Int,
    @SerializedName("humidity") val humidity: Int,
    @SerializedName("temp_min") val tempMin: Double,
    @SerializedName("temp_max") val tempMax: Double
)

data class Weather(
    @SerializedName("id") val id: Int,
    @SerializedName("main") val main: String,
    @SerializedName("description") val description: String,
    @SerializedName("icon") val icon: String
)

data class Clouds(
    @SerializedName("all") val all: Int
)

data class Wind(
    @SerializedName("speed") val speed: Double,
    @SerializedName("deg") val deg: Int
)
用于获取图标的url

这有点棘手,你们可以从响应中得到url,但只能得到图标的url

val iconId = weatherData.weather.firstOrNull()?. description
val iconUrl = iconId?.let{"http://openweathermap.org/img/w/${it}.png"} ?: ""
之后,您应该使用Glide库或毕加索将imageUrl加载到ImageView


查看更多关于Glide的信息这里

你能添加json响应哪个服务器返回我很抱歉我是新来的。你是什么意思?嗯。你使用openweathermap.org api吗?是的。这是我按照你告诉我的做的链接。我现在可以看到json的主要值,但我不知道如何获取其他值。检查我编辑的帖子是否可以传递所有json数据(主要、天气、坐标…)在数据类TemperatureData中,所以我可以从那里获取它们?声明它们,然后做什么?使用我提供的天气数据,您也可以访问天气字段我很抱歉发送垃圾邮件,但我对这一点太陌生了,我无法理解。我按照您告诉我的做了,但我的主要功能中有这个,我不知道如何检索描述哦,我找到了!!我必须从api.text=weatherData.weather.firstOrNull()键入这个weatherTextFromApi.text=weatherData.weather.firstOrNull()?。描述?:“非常感谢,我真的很感激!!!你好有很多不同的工具,在线和android studio插件,只有谷歌的“json到kotlin数据类”
weatherData.weather.firstOrNull()?. description ?: ""
val iconId = weatherData.weather.firstOrNull()?. description
val iconUrl = iconId?.let{"http://openweathermap.org/img/w/${it}.png"} ?: ""