Kotlin JSON массив не является примитивным массивом - PullRequest
0 голосов
/ 01 марта 2020

Доброе утро,

В настоящее время я пишу код android (kotlin) и пытаюсь проанализировать файл json с помощью URL.

Все работает нормально, когда он приходит с запросом, но, так как json немного сложнее, я не могу найти способ получить свою информацию правильно.

Каждый раз, когда я получаю JSON Исключительная ошибка или ошибка, говорящая мне, что массив не является примитивным.

Это важная часть моего кода, где случаются маги c.

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()
                }

            }

Это небольшая часть JSON из следующих (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"
      },

1 Ответ

3 голосов
/ 01 марта 2020

Во-первых, вы никогда не задавали вопрос. Вы сказали, что была проблема, но не указали, где. Одна вещь, которую я заметил, это то, что вы проверяете значение isSucess в виде строки, ссылка json показывает, что код возвращается в виде числового значения. - Используйте optInt вместо optString, а затем удалите двойные кавычки вокруг условия if, которое может помочь вам в этом.

if (isSucess == 200) {

Тем не менее, я думаю, что вы могли бы значительно упростить свою задачу, используя библиотеку, которая автоматически выполняет синтаксический анализ ответа json, а затем возвращает модель ответа в виде объектов данных.

Одна из таких библиотек - gson . Вы бы использовали его следующим образом ..

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

Для начала вам нужно объявить классы вашей модели данных:

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
)

Затем вы проанализируете json как это:

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

И вы бы использовали переменную rootJsonObject.data.nearstations в качестве списка адаптеров.

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

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