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"
},
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 isSucess
una cadena, el enlace muestra el código JSON se devuelve como un valor numérico. - Uso optInt
en lugar de optString
y 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.nearstations
variable como la lista de adaptadores.
Espero que esto ayude.