如何使用 Kotlin 中的 Volley 正确解析此 JSON 响应

How to properly parse this JSON response with Volley in Kotlin

我很难尝试解析以下 JSON 并将其保存在列表中。

{
  "statut": "Success",
  "rubrique": [
    {
      "rubrique": "Accueil",
      "position": "1"
    },
    {
      "rubrique": "Films",
      "position": "2"
    },
    {
      "rubrique": "Séries",
      "position": "3"
    },
    {
      "rubrique": "Sketchs",
      "position": "4"
    },
    {
      "rubrique": "Musique",
      "position": "5"
    }
  ]
}

我尝试了几种方法然后下面的代码起作用了,除了我的列表只包含一个项目:Musique

val queue = Volley.newRequestQueue(activity)
        val stringRequest = StringRequest(Request.Method.GET, endpoint,
            Response.Listener<String> { response ->
                val stringResponse = response.toString()
                val jsonObj = JSONObject(stringResponse)
                val jsonArray: JSONArray = jsonObj.getJSONArray("rubrique")

                for (i in 0 until jsonArray.length()) {
                    val innerBlock: JSONObject = jsonArray.getJSONObject(i)
                    val item: RubriqueItem = RubriqueItem()
                    item.position = innerBlock.getString("position")
                    item.rubrique = innerBlock.getString("rubrique")

                    categories?.add(item)
                }
                binding?.viewPagerMain?.adapter = BaseCategoriesFragmentPagerAdapter(
                    parentFragmentManager, categories)
                binding?.tabLayout?.setupWithViewPager(binding?.viewPagerMain)
            },
            Response.ErrorListener {error -> error.printStackTrace() })
        queue.add(stringRequest)

categories 是我需要传递给 ViewPager 适配器的 ArrayList。试图找出一种传递索引的方法,但我是 Kotlin 的新手,还无法弄清楚

欢迎任何提示

您具体在哪里初始化 "categories"?

我在这里看到 2 个可能的问题: 1 -> 类别仅包含您的最后数据。 (你可以看看是否是添加:

Log.d("VolleyRequestResult", categories.toString()

就在

之前
binding?.viewPagerMain?.adapter = BaseCategoriesFragmentPagerAdapter(
                    parentFragmentManager, categories)

2 -> 你的 BaseCategoriesFragmentPagerAdapter 只显示最后的数据(你应该分享这段代码,这样我们才能更好地理解发生了什么)

您可以为此使用 Gson 库。

首先准备响应的数据class。

ApiResponse.kt:

data class Rubrique(
    val rubrique: String,
    val position: String
)

data class ApiResponse(
    val statut: String,
    val rubrique: List<Rubrique>
)

然后解析响应你只需要一行:

val responseObject = Gson().fromJson(stringResponse, ApiResponse::class.java)

responseObject 将拥有所有信息。以及 responseObject.rubrique.

中的列表

你的代码应该在这之后:

val stringRequest = StringRequest(Request.Method.GET, endpoint,
    Response.Listener<String> { response ->
        val responseObject = Gson().fromJson(response.toString(), ApiResponse::class.java)
        binding?.viewPagerMain?.adapter = BaseCategoriesFragmentPagerAdapter(
            parentFragmentManager, responseObject.rubrique)
        binding?.tabLayout?.setupWithViewPager(binding?.viewPagerMain)
    },
    Response.ErrorListener {error -> error.printStackTrace() })
queue.add(stringRequest)