Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 解析的gson在kotlin中返回null_Android_Json_Kotlin_Gson - Fatal编程技术网

Android 解析的gson在kotlin中返回null

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

我是编程新手, 我正试图从yahoo weather api中获取日出/日落时间,并在Ui上为其祝酒

(我正在使用gson和anko图书馆) 这是我的主要活动代码:

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比天文学部分要大得多。您有两种选择(一种是实物期权,另一种是临时期权,用于检查情况):

  • 创建多个模型来解析整个堆栈(这意味着您将拥有一个
    查询
    类,其属性包括
    计数
    已创建
    语言
    结果
    )。这将是更好的方法,因为在这一过程中的每一步都要处理真实的类
  • 将整个字符串放入一个通用的
    JsonObject
    (这是GSON提供的类),并遍历该对象(
    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}")
}