Pet*_*and 2 parsing android json httprequest kotlin
我正在尝试从 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
})
}
Run Code Online (Sandbox Code Playgroud)
所以当我运行上面的我得到以下。
从我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}
Run Code Online (Sandbox Code Playgroud)
具体细节可能并不重要,它只是来自 WeatherApi,但我可以看到它有效。此外,它似乎是一个字符串。重要的是,如果我尝试并将println(d.toString())其识别为字符串,然后变灰.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)
Run Code Online (Sandbox Code Playgroud)
所以这里的错误告诉我在某个地方我试图将一个 jsonarray 对象转换为一个字符串。它不能来自 d -> JsonObject。我已经看到,如果我注释掉该行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")}")
Run Code Online (Sandbox Code Playgroud)
有谁知道出了什么问题?
快速编辑:
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")}")
Run Code Online (Sandbox Code Playgroud)
正确打印塞德里克的名字。所以这似乎很好。唔....
整洁,我知道燃料。
"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
}
Run Code Online (Sandbox Code Playgroud)
请注意,这httpGet只是另一种写法Fuel.get(),它是一个String扩展函数,重要的部分是我使用reponseJSON了responseString. 您还需要.getString("name")在对象上使用。您也可以使用类似.getJSONObject或的东西.getJSONArray。
| 归档时间: |
|
| 查看次数: |
3644 次 |
| 最近记录: |