我正在尝试确定可让我使用Kotlin中的JSON对象访问API的关键字。我已经在Java中看到了很多示例,但是我对如何在Kotlin中弄清楚这一点感到困惑。
我正在使用的API是http://numbersapi.com/#random/trivia,并且可以访问以下参数:text
,number
,found
和type
。
val apiURL = "http://numbersapi.com/random/year?json"
private fun loadRandomFact() {
runOnUiThread {
progressBar.visibility = View.VISIBLE
}
val request:Request = Request.Builder()
.url(apiURL).build()
okHttpClient.newCall(request).enqueue(object: Callback {
override fun onFailure(call: Call, e: IOException) {
}
override fun onResponse(call: Call, response: Response) {
val json = response?.body()?.string()
val txt = (JSONObject(json).getJSONObject("number")
.get("text")).toString()
//update the ui from the ui thread
runOnUiThread {
progressBar.visibility = View.GONE
//use Html class to decode html entities
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
factTv.text = Html.fromHtml(txt,Html.FROM_HTML_MODE_LEGACY)
} else {
factTv.text = Html.fromHtml(txt)
}
}
}
})
我在val txt
中知道JSON对象(number
和text
)中的查询是错误的,因为我的应用程序崩溃了,并且我知道它可以使用类似的API并告诉我因此在LOGCAT中:
Caused by: org.json.JSONException: No value for
at org.json.JSONObject.get(JSONObject.java:392)
at org.json.JSONObject.getJSONObject(JSONObject.java:612)
Kotlin JSON函数将对此API进行哪些查询?我尝试了很多组合,但没有一个起作用。
答案 0 :(得分:0)
自Retrofit2起,它没有默认转换器,您需要添加一个。
对于GSON,您可以执行以下操作:
Retrofit retrofit = new Retrofit.Builder()
.client(client)
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
您可以像这样使用它: ApiInterface.kt
interface ApiInterface {
@GET("year?json")
fun fetchFact() : Call<JsonObject>
companion object {
fun create() : ApiInterface {
val client = OkHttpClient.Builder()
.build()
return Retrofit.Builder()
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://numbersapi.com/random/")
.build().create(ApiInterface::class.java)
}
}
}
活动:
val service = ApiInterface.create()
val call: Call<JsonObject> = service.fetchFact()
call.enqueue(object : retrofit2.Callback<JsonObject> {
override fun onResponse(call: Call<JsonObject>, response: Response<JsonObject>) {
val response = response.body()
Log.d("Sample",response.toString())
Log.d("Sample", "Text: "+response!!.get("text").toString())
// rest of the keys...
}
override fun onFailure(call: Call<JsonObject>, t: Throwable) {
Log.d("Sample",t.message)
}
})
参考:https://speakerdeck.com/jakewharton/simple-http-with-retrofit-2-droidcon-nyc-2015?slide=67
注意: 这不是唯一的方法,但是我能够从您提供的URL中获取数据。
Retrofit:检查“转换器”部分是否使用其他转换器
希望有帮助。