Kotlin Android,从HTTP请求解析Json

Kotlin Android,从HTTP请求解析Json,android,json,parsing,kotlin,httprequest,Android,Json,Parsing,Kotlin,Httprequest,我试图从Kotlin Android文件中的http请求解析json。如果我只想提取一个元素,我真的希望避免每次发出http请求时都必须专门使用GSON将其反序列化到类中。我来自javascript领域,在那里,将json解析为对象表示法是现成的,所以这引起了不安 以下是我目前正在处理的问题。我使用Fuel发出http请求,Klaxon尝试解析它 Fuel.get("http://api.openweathermap.org/data/2.5/weather?q=Austin,us&am

我试图从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(“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()

现在,从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”)}”)
,但我不确定这是否仍然意味着
val-json
对象仍然被错误处理(如果它赋值并且没有使用,编译器是否正确地评估了它?)

令人沮丧的是,根据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

的东西,谢谢!伙计,我希望这个答案比实际情况更明显。@Peterwey很高兴我能帮助你!你说的“更明显”是什么意思?