簡體   English   中英

Kotlin Android,從HTTP請求解析Json

[英]Kotlin Android, Parsing Json from HTTP request

我正在嘗試從Kotlin Android文件中的http請求解析json。 如果我只想提取一個元素,我真的想避免每次我發出http請求時都必須專門使用GSON反序列化為一個類。 我來自javascript領域,將json解析為對象符號是開箱即用的,所以這引起了人們的不滿。

這是我目前正在使用的工具。 我正在使用Fuel發出http請求,並使用Klaxon嘗試解析它。

    Fuel.get("http://api.openweathermap.org/data/2.5/weather?q=Austin,us&appid=MYAPIKEYSUPERDUPERSECRET").responseString { request, response, result ->
            //do something with response
            result.fold({ d ->
                  println("value of d")
                  println(d)
                  val parser = Parser()
                  val stringBuilder = StringBuilder(d)
                  val json: JsonObject = parser.parse(stringBuilder) as JsonObject
                  println("Weather : ${json.string("weather")}")
            }, { err ->
                //do something with error
            })
        }

因此,當我運行上面的代碼時,我得到以下內容。

從我的println("value of d")我得到

{"coord":{"lon":-97.74,"lat":30.27},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04d"}],"base":"stations","main":{"temp":297.15,"pressure":1010,"humidity":69,"temp_min":296.15,"temp_max":298.15},"visibility":16093,"wind":{"speed":5.7,"deg":150,"gust":11.8},"clouds":{"all":90},"dt":1519082640,"sys":{"type":1,"id":2558,"message":0.0053,"country":"US","sunrise":1519045581,"sunset":1519086201},"id":4671654,"name":"Austin","cod":200}

具體細節可能並不重要,這只是WeatherApi的優勢,但我可以看到它的有效性。 另外,它似乎是一個字符串。 重要的是,如果我嘗試使用println(d.toString())它將其識別為字符串,並且將.toString() println(d.toString())

現在,從Klaxon解析中,我得到以下錯誤:

FATAL EXCEPTION: main
 Process: com.example.patientplatypus.androidhoneytabs, PID: 32050
 java.lang.ClassCastException: com.beust.klaxon.JsonArray cannot be cast to java.lang.String
    at com.beust.klaxon.JsonObject.string(JsonObject.kt:74)
        at com.example.patientplatypus.androidhoneytabs.MainActivity$onCreate$2.invoke(MainActivity.kt:74)
        at com.example.patientplatypus.androidhoneytabs.MainActivity$onCreate$2.invoke(MainActivity.kt:39)
        at com.github.kittinunf.fuel.core.DeserializableKt$response$1.invoke(Deserializable.kt:37)
        at com.github.kittinunf.fuel.core.DeserializableKt$response$1.invoke(Unknown Source:4)
        at com.github.kittinunf.fuel.core.DeserializableKt$response$5$1.invoke(Deserializable.kt:62)
        at com.github.kittinunf.fuel.core.DeserializableKt$response$5$1.invoke(Unknown Source:0)
        at com.github.kittinunf.fuel.core.Request$callback$1.run(Request.kt:225)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

所以這里的錯誤告訴我,我正在某處嘗試將jsonarray對象轉換為字符串。 它不能來自d-> JsonObject。 我已經看到,如果我將println("Weather : ${json.string("weather")}")println("Weather : ${json.string("weather")}") ,但是我不確定這是否仍然意味着val json對象仍然被錯誤處理(如果它分配並且未使用,編譯器是否會正確評估它?)。

令人沮喪的是,根據Klaxon文檔,這似乎是正確的用法。 參見: https : //github.com/cbeust/klaxon及以下:

val parser: Parser = Parser()
val stringBuilder: StringBuilder = StringBuilder("{\"name\":\"Cedric Beust\", \"age\":23}")
val json: JsonObject = parser.parse(stringBuilder) as JsonObject
println("Name : ${json.string("name")}, Age : ${json.int("age")}")

有誰知道出什么問題了嗎?

快速編輯:

 result.fold({ d ->
        println("value of d")
        println(d)
        val parser: Parser = Parser()
        val stringBuilder: StringBuilder = StringBuilder("{\"name\":\"Cedric Beust\", \"age\":23}")
        val json: JsonObject = parser.parse(stringBuilder) as JsonObject
        println("Name : ${json.string("name")}, Age : ${json.int("age")}")

正確打印Cedric的名稱。 因此,這似乎很好。 嗯...

整潔,我知道加油。

"http://api.openweathermap.org/data/2.5/weather?q=Austin,us&appid=MYAPIKEYSUPERDUPERSECRET"
        .httpGet().responseJSON { _, _, result ->
    result.get().obj() // here you have your JSON object
}

請注意httpGet只是編寫Fuel.get()另一種方法,它是String擴展函數,重要的部分是我使用了reponseJSON而不是responseString 另外,您將需要在對象上使用.getString("name") 您還可以使用.getJSONObject.getJSONArray類的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM