gama de Kotlin JSON no es una matriz primitiva

Tim Soph:

Buenos días,

Actualmente estoy de codificación en android (Kotlin), y yo estoy tratando de analizar un archivo JSON con la url.

Todo está trabajando muy bien en lo que respecta a la solicitud, pero dado que el JSON es un poco complicado, me parece que no puede encontrar una manera de obtener mis informaciones correctamente.

Cada vez que sale un error de JSON excepcion o un error que me dice que la matriz no es un ser primitivo.

Esta es la parte esencial de mi código eran sucede la magia.

try {
            // Create JSONObject from string response if your response start from Array [ then create JSONArray
            val rootJsonObject = JSONObject(results)
            val isSucess = rootJsonObject.optString("code")

            if (isSucess == "200") {

                val streetArray = rootJsonObject.getJSONObject("data").getJSONObject("nearstations")
                val mJsonArray = JSONArray(streetArray)

                for (i in 0 until mJsonArray.length()) {

                    val sObject = mJsonArray.getJSONObject(i).toString()
                    val mItemObject = JSONObject(sObject)

                    val id = mItemObject.getString("id")
                    val street_name = mItemObject.getString("street_name")


                    val mHash = HashMap<String, String>()

                    mHash["id"] = "Id: $id"
                    mHash["street_name"] = "Name: $street_name"

                    streetList.add(mHash)
                }

                // This is simple Adapter (android widget) for ListView
                val simpleAdapter = SimpleAdapter(
                    applicationContext, streetList,
                    R.layout.simple_listview_item,
                    // Add String[] name same as HashMap Key
                    arrayOf("id", "street_name"),
                    intArrayOf(R.id.tv_id, R.id.tv_street_name))

                Lv_client.adapter = simpleAdapter

                Lv_client.setOnItemClickListener { parent, view, position, id ->
                    Toast.makeText(applicationContext, "Selected item is " + position, Toast.LENGTH_SHORT).show()
                }

            }

Esta es una pequeña parte de la JSON de los siguientes ( http://barcelonaapi.marcpous.com/bus/nearstation/latlon/%2041.3985182/2.1917991/1.json )

"code": 200,
  "data": {
    "nearstations": [
      {
        "id": "1",
        "street_name": "Almogàvers-Àvila",
        "city": "BARCELONA",
        "utm_x": "432542,5460",
        "utm_y": "4583524,2340",
        "lat": "41.3985182",
        "lon": "2.1917991",
        "furniture": "Pal",
        "buses": "06 - 40 - 42 - 141 - B25 - N11",
        "distance": "0"
      },
      {
        "id": "2721",
        "street_name": "Àvila-Almogàvers",
        "city": "BARCELONA",
        "utm_x": "432641,0420",
        "utm_y": "4583509,2710",
        "lat": "41.3985182",
        "lon": "2.1917991",
        "furniture": "Pal",
        "buses": "92",
        "distance": "0"
      },
Chris:

Lo primero es que en realidad nunca se hizo una pregunta. Usted dijo que había un problema, pero no especifica dónde. Una cosa que he notado es que se está comprobando el valor de isSucessuna cadena, el enlace muestra el código JSON se devuelve como un valor numérico. - Uso optInten lugar de optStringy luego quitar las comillas dobles alrededor de la condición si puede ayudarle a lo largo.

if (isSucess == 200) {

Sin embargo, creo que se podría simplificar su tarea en gran medida mediante el uso de una biblioteca que se ocupa del análisis de la respuesta JSON de forma automática y luego regresan un modelo de la respuesta en forma de objetos de datos.

Uno de estos es la biblioteca GSON . Tendrá que utilizar como sigue ..

val rootJsonObject = Gson().fromJson(json, RootJsonObject::class.java)

Para empezar que había necesidad de declarar las clases del modelo de datos:

data class RootJsonObject(
    val code: Int,
    val data: DataJsonObject
)

data class DataJsonObject(
    val nearstations: List<NearStation>
)

data class NearStation(
    val id: String,
    val street_name: String,
    val city: String,
    val utm_x: String,
    val utm_y: String,
    val lat: String,
    val lon: String,
    val furniture: String,
    val buses: String,
    val distance: String
)

Entonces será analizar el JSON como esto:

val rootJsonObject = Gson().fromJson(json, RootJsonObject::class.java)
if (rootJsonObject.code != 200) {
    return
}

Y lo haría con el rootJsonObject.data.nearstationsvariable como la lista de adaptadores.

Espero que esto ayude.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=283177&siteId=1
Recomendado
Clasificación