【问题标题】:Kotlin JSON's array is not a primitive arrayKotlin JSON 的数组不是原始数组
【发布时间】:2020-02-29 22:18:16
【问题描述】:

早上好,

我目前正在 android (kotlin) 上编码,我正在尝试使用 url 解析一个 json 文件。

请求时一切正常,但由于 json 有点棘手,我似乎无法找到正确获取信息的方法。

每次我收到 JSON 异常错误或告诉我该数组不是原始数组的错误。

如果奇迹发生,这是我的代码的重要部分。

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

            }

这是来自以下 (http://barcelonaapi.marcpous.com/bus/nearstation/latlon/%2041.3985182/2.1917991/1.json) 的 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"
      },

【问题讨论】:

    标签: android json kotlin


    【解决方案1】:

    首先,你从来没有真正问过问题。你说有问题,但没有具体说明在哪里。 我注意到的一件事是您正在检查 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 变量作为适配器列表。

    希望这会有所帮助。

    【讨论】:

    • 非常感谢,我马上去调查一下 :)
    • 嘿!它终于奏效了!谢谢!哼哼,我怎样才能发布我为其他人所做的修改?
    • 太棒了。您可以只回复您的问题,说明您为解决问题所做的工作。干得好!
    • 好的,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多