Android 解析的gson在kotlin中返回null
我是编程新手, 我正试图从yahoo weather api中获取日出/日落时间,并在Ui上为其祝酒 (我正在使用gson和anko图书馆) 这是我的主要活动代码:Android 解析的gson在kotlin中返回null,android,json,kotlin,gson,Android,Json,Kotlin,Gson,我是编程新手, 我正试图从yahoo weather api中获取日出/日落时间,并在Ui上为其祝酒 (我正在使用gson和anko图书馆) 这是我的主要活动代码: class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.act
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
fetchJson()
}
fun fetchJson(){
val url = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22nome%2C%20ak%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"
val request = Request.Builder().url(url).build()
val client = OkHttpClient()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call?, e: IOException?) {
toast("Failed to execute request")
}
override fun onResponse(call: Call?, response: Response?) {
val body = response?.body()?.string()
println(body)
val gson = GsonBuilder().create()
val Info = gson.fromJson(body, astronomy::class.java)
runOnUiThread {
// info.sunrise is returning null ???????
toast("this is running from UiThread ${Info.sunrise}")
}
}
})
}
}
class astronomy(val sunrise: String, val sunset: String)
我应该在哪里修理
谢谢嘿,易卜拉欣·霍什努德
欢迎来到StackOverflow。问题似乎是,您还没有为天文学的父对象创建POJO(类)。如果您希望仅使用Gson解析所有内容,则必须为“查询”、“结果”、“通道”创建对象,然后在通道内部可以拥有天文学对象
例如,你可以有这样的东西
class Query(val results: List<Channel>?)
class Channel(val astronomy: astronomy?) // astronomy? is the class you have posted.
你从雅虎那里得到的回应!API比天文学部分要大得多。您有两种选择(一种是实物期权,另一种是临时期权,用于检查情况):
- 创建多个模型来解析整个堆栈(这意味着您将拥有一个
类,其属性包括查询
、计数
、已创建
和语言
)。这将是更好的方法,因为在这一过程中的每一步都要处理真实的类结果
- 将整个字符串放入一个通用的
(这是GSON提供的类),并遍历该对象(JsonObject
->query
->results
->channel
->天文学
和日出
)。这不是正确的方法,但可以确保数据正确输入:日落
你们的天文学课看起来像什么?我是作为一个教程来做的,但教程是解析到回收器视图,我的是一个单独的对象,这是我的天文学课课堂天文学(瓦尔日出:弦,瓦尔日落:弦)嗯,我相信这不足以得到日出/日落的时间。使用:将Json输出转换为POJO。或者,在不使用Gson的情况下逐数组获取字符串数组。@ઽ૯ท 谢谢,但我想用一个文本框改变城市,(我稍后会编辑url)谢谢你,我不想让课堂上的部分工作,但是让az json工作,非常感谢
val query = gson.fromJson(body, astronomy::class.java)
val astronomy = query.results?.astronomy
data class Query(val count: Int?, val created: String?, val lang: String?, val results: Results?)
data class Results(val channel: Channel?)
//Channel should include more fields for the rest of the data
data class Channel(val astronomy: Astronomy?)
data class Astronomy(val sunrise: String?, val sunset: String?)
val jsonObj: JsonObject = JsonParser().parse(body).asJsonObject
val astronomy = jsonObj
.getAsJsonObject("query")
.getAsJsonObject("results")
.getAsJsonObject("channel")
.getAsJsonObject("astronomy")
runOnUiThread {
toast("this is running from UiThread ${astronomy.get("sunrise").asString}")
}