【问题标题】:parsed gson returns null in kotlin解析的 gson 在 kotlin 中返回 null
【发布时间】:2018-09-10 14:20:45
【问题描述】:

我是编程新手, 我正在尝试从 yahoo 天气 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)

我应该在哪里解决?

谢谢

【问题讨论】:

  • 你的天文学课是什么样子的?
  • 我是按照教程做的,但是教程是要解析为回收站视图,而我的是单个对象,这是我的天文学课。 : 天文学类(val 日出:字符串,val 日落:字符串)
  • 好吧,我相信这不足以获得日出/日落时间。使用:jsonschema2pojo.org 将您的 Json 输出转换为 POJO。或者,在没有 Gson 的情况下按数组获取字符串数组..
  • @ʍѳђઽ૯ท 谢谢,但我希望能够使用文本框更改城市,(稍后我将编辑 url)

标签: android json kotlin gson


【解决方案1】:

您从该 Yahoo! 收到的回复API 远远大于天文学部分。您有两种选择(一种是实际选择,另一种是临时选择):

  • 创建多个模型来解析整个堆栈(这意味着您将拥有一个具有 countcreatedlangresults 等属性的 Query 类)。这将是更好的方法,因为您将在每一步都处理真实的类。
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?)
  • 将整个字符串放入通用JsonObject(这是GSON提供的类)并遍历该对象(query -> results -> channel -> astronomy -> sunrisesunset)。这不是正确的方法,但可以确保您的数据正确输入:
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}")
}

【讨论】:

  • 谢谢老兄,我不能让课堂部分工作,但让 az json 工作,非常感谢
【解决方案2】:

嘿易卜拉欣·科什诺德!

欢迎来到 StackOverflow。问题似乎是,您还没有为天文学的父对象创建 POJO(类)。如果您只想使用 Gson 解析所有内容,则必须为“查询”、“结果”、“通道”创建对象,然后在通道内部可以拥有天文对象。

所以例如你可以有这样的东西。

class Query(val results: List<Channel>?)
class Channel(val astronomy: astronomy?) // astronomy? is the class you have posted.

然后你可以像这样解析所有内容

val query = gson.fromJson(body, astronomy::class.java)
val astronomy = query.results?.astronomy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多