通过API在Kotlin中获取JSON字符串

时间:2019-04-18 21:03:43

标签: android json kotlin

我正在尝试确定可让我使用Kotlin中的JSON对象访问API的关键字。我已经在Java中看到了很多示例,但是我对如何在Kotlin中弄清楚这一点感到困惑。

我正在使用的API是http://numbersapi.com/#random/trivia,并且可以访问以下参数:textnumberfoundtype

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对象(numbertext)中的查询是错误的,因为我的应用程序崩溃了,并且我知道它可以使用类似的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进行哪些查询?我尝试了很多组合,但没有一个起作用。

1 个答案:

答案 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:检查“转换器”部分是否使用其他转换器

希望有帮助。