Как я могу прочитать огромный файл JSON с Kotlin? - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь прочитать файл json, касающийся моих уроков планирования в университете, получая его по этой ссылке: http://diag.uniroma1.it/pannello/?q=export_json

Я пытался сделать это, используя https://developer.android.com/training/volley/simple, который работает для оченьпростой файл json, как в https://helloacm.com/api/factor/?cached&n=10 (где задано число, оно возвращает факторизацию самого себя).

Но применение тех же рассуждений не работает. На самом деле приложение, которое раньше работало хорошо, теперь вылетает.

 fun factors (x: String){

        val queue = Volley.newRequestQueue(this)
        //val url = "https://helloacm.com/api/factor/?cached&n="+x

        val url = "http://diag.uniroma1.it/pannello/?q=export_json"

        var reply : String = ""

        // Request a string response from the provided URL.
        val stringRequest = StringRequest(
            Request.Method.GET, url,
            Response.Listener<String> { response ->
                // Display the first 500 characters of the response string.
                reply = JSONObject(response.toString()).toString()
                output.text=reply
            },
            Response.ErrorListener { error: VolleyError? ->  output.text = error.toString() })

        // Add the request to the RequestQueue.
        queue.add(stringRequest)

    }

В чем проблема? Файл слишком большой по сравнению с предыдущим? Я действительно новичок в этом деле

1 Ответ

2 голосов
/ 28 октября 2019

Причина, по которой он не работает, заключается в том, что вы получаете массив JSON, но пытаетесь проанализировать его как объект JSON.

Чтобы упростить десериализацию, вы можете проверить Google GsonБиблиотека . Вот пример реализации Gson:

  1. Добавьте следующую зависимость в ваш файл build.gradle и синхронизируйте ваш проект с Gradle:

    implementation 'com.google.code.gson:gson:2.8.6'
    
  2. Создайте модель, которая представляет ваши объекты JSON:

    import com.google.gson.annotations.SerializedName
    
    data class DataObject(
        @SerializedName("data")
        val data: String,
        @SerializedName("Descrizione")
        val descrizione: String,
        @SerializedName("Id")
        val id: String,
        @SerializedName("id_aula")
        val idAula: String,
        @SerializedName("minuti_fine")
        val minutiFine: String,
        @SerializedName("minuti_inizio")
        val minutiInizio: String,
        @SerializedName("nome_aula")
        val nomeAula: String,
        @SerializedName("ora_fine")
        val oraFine: String,
        @SerializedName("ora_inizio")
        val oraInizio: String
    )
    
  3. Теперь вы можете изменить свою функцию для десериализации JSON:

    fun factors(x: String) {
    
        val queue = Volley.newRequestQueue(this)
        //val url = "https://helloacm.com/api/factor/?cached&n="+x
    
        val url = "http://diag.uniroma1.it/pannello/?q=export_json"
    
        var reply: List<DataObject> = listOf()
    
        // Request a string response from the provided URL.
        val stringRequest = StringRequest(
                Request.Method.GET, url,
                Response.Listener<String> { response ->
                    // Display the first 500 characters of the response string.
                    reply = Gson().fromJson(response, object : TypeToken<List<DataObject>>() {}.type)
                    output.text = reply
                },
                Response.ErrorListener { error: VolleyError? -> output.text = error.toString() })
    
        // Add the request to the RequestQueue.
        queue.add(stringRequest)
    }
    
...