【问题标题】:Kotlin parsing JSONKotlin 解析 JSON
【发布时间】:2021-10-08 07:12:18
【问题描述】:

我是 kotlin 和 JSON 解析的新手,我无法让它正常工作kotlin 它给了我一个不匹配,我不确定输出的问题是什么,也许是方括号?有没有办法摆脱它们以便它可以读取它,或者我可以在 kotlin 方面做些什么?

private fun retriveProperties() {
        val sharedPref = getSharedPreferences("#####", Context.MODE_PRIVATE)
        var username = sharedPref.getString("user", null)
        val password = sharedPref.getString("pas", null)
        val url = "https://www.#########.com/api/getproperties.php?user="+username+"&pass="+password
        val request = JsonObjectRequest(Request.Method.GET, url, null, Response.Listener {
                response ->try {
            val jsonArray = response.getJSONArray("")
            for (i in 0 until jsonArray.length()) {
                val employee = jsonArray.getJSONObject(i)
                val firstName = employee.getString("FName")
                Toast.makeText(applicationContext, firstName, Toast.LENGTH_LONG).show()
            }
        } catch (e: JSONException) {
            e.printStackTrace()
        }
        }, Response.ErrorListener { error -> error.printStackTrace() })
        requestQueue?.add(request)
    }

堆栈跟踪是:

2021-08-02 21:52:02.322 19237-19237/com.#########.######### W/System.err: com.android.volley.ParseError: org.json.JSONException: Value [{"ID":"1","FName":"#########","LName":"#########","Email":"##################@#########.com","Username":"#########","Password#########","Tel":"#########","LotID":"1","Price":"1.0","Often":"BiWeekly","JLevel":"2","Subscription":"0","Active":"1","OrderID":"#########","PPemail":"##################@gmail.com","PPname":"######### #########","PPID":"#########"}] of type org.json.JSONArray cannot be converted to JSONObject
2021-08-02 21:52:02.322 19237-19237/com.#########.######### W/System.err:     at com.android.volley.toolbox.JsonObjectRequest.parseNetworkResponse(JsonObjectRequest.java:90)
2021-08-02 21:52:02.323 19237-19237/com.#########.######### W/System.err:     at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:144)
2021-08-02 21:52:02.323 19237-19237/com.#########.######### W/System.err:     at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:111)
2021-08-02 21:52:02.323 19237-19237/com.#########.######### W/System.err:     at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:90)
2021-08-02 21:52:02.323 19237-19237/com.#########.######### W/System.err: Caused by: org.json.JSONException: Value [{"ID":"1","FName":"#########","LName":"#########","Email":"##################@#########.com","Username":"#########","Password#########","Tel":"#########","LotID":"1","Price":"1.0","Often":"BiWeekly","JLevel":"2","Subscription":"0","Active":"1","OrderID":"#########","PPemail":"##################@gmail.com","PPname":"######### #########","PPID":"#########"}] of type org.json.JSONArray cannot be converted to JSONObject
2021-08-02 21:52:02.323 19237-19237/com.#########.######### W/System.err:     at org.json.JSON.typeMismatch(JSON.java:112)

我在服务器端尝试了trim($json, '[]'),但没有奏效,因为 kotlin 抱怨它不是真正的 JSON……所以现在正在寻找其他解决方案……

【问题讨论】:

    标签: android arrays json kotlin parsing


    【解决方案1】:

    错误是不言自明的。它说您正在尝试将JSONArray 解析为JSONObject。您收到的回复是这种模式[{user: "USER1"}, {user: "USER2"}],您正在尝试像{user: "USER1"} 一样阅读它。您的响应可以有多个对象,因为您已将其包装在一个数组中。据我了解,情况并非如此,您只会收到 1 个用户对象。因此,要么将服务器响应更改为对象,代码就可以在 FE 上运行。否则,如果您需要它是一个数组,您可以更改 FE 代码以解析 JSONArray 并迭代以获取 JSON 对象。

    【讨论】:

      【解决方案2】:

      用户模型需要有一个可序列化的实现。

      data class User(
          var id: String,
          var FName: String,
          ...
      ) : Serializable
      

      然后从 JSON 数组中取出值并添加到列表中

      val jsonArray = JSONArray(response)
      var users: MutableList<User> = mutableListOf()
      
      for(i in 0 until jsonArray.length()) {
          var user = Gson().fromJson(jsonArray[i].toString(), User::class.java)
          users.add(user)
      }
      

      【讨论】:

        【解决方案3】:

        改用 Gson,将其添加到您的应用中 build.gradle,如下所示:

        implementation 'com.google.code.gson:gson:2.8.7'
        

        然后你可以定义你的对象模型,例如:

        data class User(
            @SerializedName("id")
            val id : String,
        
            @SerializedName("Fname")
            val Fname : String
        )
        

        您可以使用以下方式解析 json:

        val user = Gson().fromJson<User>("{}")
        

        【讨论】:

          【解决方案4】:

          它没有解决 JSON 问题,但我通过将字符串更改为得到我的信息

          info1|info2|info3|etc
          

          然后在 kotlin 方面

          val lstValues: List<String> = response.split("|").map { it -> it.trim() }
          
          var fname = lstValues.elementAt(0)
          var lname = lstValues.elementAt(1)
          Toast.makeText(applicationContext, "Welcome "+fname + " "+lname, Toast.LENGTH_LONG).show()
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-13
            • 1970-01-01
            • 2020-11-04
            • 2018-07-23
            • 2017-06-15
            相关资源
            最近更新 更多