android - 从 json (kotlin android) 获取天气结果
问题描述
我试图从 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>
}
我的温度数据类
data class TemperatureData(var temp: String)
还有我的 WeatherDataJson 类
data class WeatherDataJson(var description:String)
在我的主类中,我有一个函数可以将 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
}
}
}
})
}
在描述上是说未解决的参考描述
解决方案
如果你使用 openweathermap api 声明那些数据类
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
)
如果您的目标是从天气中获取描述,您所需要的将是
weatherData.weather.firstOrNull()?. description ?: ""
用于获取图标的 url
这有点棘手,您可以从响应中获取 url,但只能获取图标的 url。
val iconId = weatherData.weather.firstOrNull()?. description
val iconUrl = iconId?.let{"http://openweathermap.org/img/w/${it}.png"} ?: ""
之后,您应该使用 Glide 库或 Picasso 将 imageUrl 加载到 ImageView
在此处查看有关 Glide 的更多信息https://github.com/bumptech/glide
推荐阅读
- django - Django自定义用户密码没有被散列
- c - 示波器从 UART 读取正确的数据,但不是接收微控制器
- javascript - Discord.js我如何添加带有标签成员的命令addrole
- javascript - 单击单元格时获取列标题
- python - 将来自 html 网页的表格转换为 pandas 数据框
- python - 如何在pygame中添加蛇身
- firebase - 如何显示所有用户的倒计时时间
- javascript - NodeJS knex Select Innerjoin 多个字段
- python - /admin/ 的 Wagtail KeyError 4
- javascript - 调用 ngrenderer.selectRootElement 时,角度选择元素会丢失数据