首页 > 解决方案 > 如何将下面的 json 数据解析为 kotlin?

问题描述

大家好,我已经能够将 name/practiceOnDate 属性解析为 kotlin 数据类,但我无法正确解析 exercices 属性,您可以检查屏幕截图以获取我得到的输出。你知道我必须做什么吗?(编辑:我在 recyclerView 中显示数据)

[
{
    "name": "Introductory Session",
    "practicedOnDate": "2016-05-08T14:48:28.257Z",
    "exercises": [
        {
            "exerciseId": "0",
            "name": "Quarters flat minor C",
            "practicedAtBpm": 40
        },
        {
            "exerciseId": "1",
            "name": "Triplets flat major A",
            "practicedAtBpm": 40
        },
        {
            "exerciseId": "2",
            "name": "Eigths flat minor A",
            "practicedAtBpm": 40
        },
        {
            "exerciseId": "3",
            "name": "Eigths sharp minor C",
            "practicedAtBpm": 40
        }
    ]
}

这是我的 getSessions 函数:

private fun getSessions() {
    val retrofitBuilder = Retrofit.Builder().addConverterFactory(GsonConverterFactory.create())
            .baseUrl(BASE_URL)
            .build()
            .create(ApiInterface::class.java)
    val retrofitData = retrofitBuilder.getData()

    retrofitData.enqueue(object : Callback<List<SessionsItem>?> {
        override fun onResponse(
                call: Call<List<SessionsItem>?>,
                response: Response<List<SessionsItem>?>
        ) {
            val responseBody = response.body()!! //NOT NULL
            myAdapter = sessionAdapter(baseContext,responseBody)
            myAdapter.notifyDataSetChanged()
            recyclerview.adapter = myAdapter


        }

        override fun onFailure(call: Call<List<SessionsItem>?>, t: Throwable) {
            d("MainActivity","onFailure"+t.message)
        }
    })
}

会话适配器:

class sessionAdapter (val context:Context,val sessionList:List<SessionsItem>):RecyclerView.Adapter<sessionAdapter.ViewHolder>(){

class ViewHolder(itemView: View):RecyclerView.ViewHolder(itemView) {
    var sessionName:TextView
    var practicedOnDate:TextView
    var exercises:TextView

    init {
        sessionName = itemView.sessionName
        practicedOnDate = itemView.practicedOnDate
        exercises = itemView.exercices
    }
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    var itemView = LayoutInflater.from(context).inflate(R.layout.row_items,parent,false)
    return ViewHolder(itemView)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.sessionName.text = sessionList[position].name
    holder.practicedOnDate.text = sessionList[position].practicedOnDate
    println(sessionList[position].exercises.get(0))
    holder.exercises.text =sessionList[position].exercises.toString()
}

override fun getItemCount(): Int {
    return sessionList.size
}}

我的会话数据类:

data class SessionsItem(
val exercises: List<Exercise>,
val name: String,
val practicedOnDate: String)

我无法使用的练习数据类:

data class Exercise(
val exerciseId: String,
val name: String,
val practicedAtBpm: Int)

这是我的输出:截图

我只想获取练习的名称和 practicedAtBpm 属性,但我得到了一切

标签: kotlin

解决方案


在练习数据类中覆盖 toString(),如下所示

data class Exercise(
val exerciseId: String,
val name: String,
val practicedAtBpm: Int){
override fun toString(): String = "name=$name, practicedAtBpm=$practicedAtBpm"
}

推荐阅读