Получить строку JSON в Kotlin из API - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь определить ключевые слова, которые позволят мне получить доступ к API с объектом JSON в Котлине.Я видел много примеров в 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?Я перепробовал так много комбинаций, но ни одна из них не сработала.

1 Ответ

0 голосов
/ 19 апреля 2019

Начиная с 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.

Модификация : проверьте раздел конвертеров на предмет использования других конвертеров

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...