首页 > 解决方案 > 如何在没有外部库的情况下解析包含对象列表的对象列表

问题描述

我正在练习在不使用外部库的情况下在 Kotlin 中解析 JSON 字符串,当我有一个包含对象列表的对象列表时,问题就开始了。这是我的 JSON

 {
   "id":"1",
   "title":"Schedule",
   "weekly_activity":[
      {
         "day":"Monday",
         "activity":[
            {
               "start":"07:30",
               "end":"",
               "activity_name":"Breakfast"
            },
            {
               "start":"07:30",
               "end":"09:30",
               "activity_name":"Escursion"
            },
            {
               "start":"09:30",
               "end":"11:00",
               "activity_name":"Talk"
            },
            {
               "start":"11:30",
               "end":"15:00",
               "activity_name":"Walk"
            },
            {
               "start":"15:00",
               "end":"16:30",
               "activity_name":"Lunch"
            },
            {
               "start":"Dalle",
               "end":"17:30",
               "activity_name":"Break"
            }
         ]
      },
      {
         "day":"Tuesday",
         "activity":[
            {
               "start":"07:31",
               "end":"",
               "activity_name":"Breakfast in the forest"
            },
            {
               "start":"07:31",
               "end":"09:31",
               "activity_name":"Walk"
            },
            {
               "start":"09:31",
               "end":"11:01",
               "activity_name":"Escursion"
            },
            {
               "start":"11:31",
               "end":"15:01",
               "activity_name":"Break"
            },
            {
               "start":"15:01",
               "end":"16:31",
               "activity_name":"Lunch"
            },
            {
               "start":"Dalle",
               "end":"17:31",
               "activity_name":"Free time"
            }
         ]
      }
   ]
}

这是我解析 JSON 的函数:

 fun parseString (): Scheduler{

        val listOfActivity: ArrayList<Activity> = arrayListOf()
        val listOfWeeklyActivity: ArrayList<WeeklyActivity> = arrayListOf()
        val jsonStringScheduler = JSONObject(parseString)


        val id = jsonStringScheduler.getString("id")
        val title = jsonStringScheduler.getString("title")
        val weeklyActivityList =jsonStringScheduler.getJSONArray("weekly_activity")
        weeklyActivityList.let {
            (0 until it.length()).forEach{
                val weeklyActivity = weeklyActivityList.getJSONObject(it)
                val day = weeklyActivity.getString("day")
                val activityList = weeklyActivity.getJSONArray("activity")

                activityList.let {
                    (0 until it.length()).forEach{
                        val activity = activityList.getJSONObject(it)
                        val start = activity.getString("start")
                        val end = activity.getString("end")
                        val activityName = activity.getString("activity_name")

                        listOfActivity.add(Activity(start, end, activityName))
                    }
                }
                listOfWeeklyActivity.add(WeeklyActivity(day,listOfActivity))
            }
        }
        val scheduler = Scheduler(id, title, listOfWeeklyActivity)
        return  scheduler
    }

每次我尝试像这样解析时,我的“每周活动”对象都有两个活动的列表,但我需要像 JSON 一样拥有它。

标签: androidjsonkotlinparsing

解决方案


您的问题是您只创建listOfActivity一次,并且在每次迭代中不断修改它。相反,您必须listOfActivity为每个weeklyActivity. 要解决这个问题,您需要listOfActivity在 的循环内移动声明weeklyActivityList,如下所示

fun parseString(): Scheduler {
    // remove this line ---> val listOfActivity: ArrayList<Activity> = arrayListOf()
    ...
    jsonStringScheduler.getJSONArray("weekly_activity")
    weeklyActivityList.let {
        (0 until it.length()).forEach {
            // Create new list of activity for every week here
            val listOfActivity: ArrayList<Activity> = arrayListOf()

            activityList.let {
                (0 until it.length()).forEach {
                    ...
                    listOfActivity.add(Activity(start, end, activityName))
                }
            }
            // listOfActivity for this week is complete, now add it to listOfWeeklyActivity
            // And for next WeeklyActivity create new listOfActivity 
            listOfWeeklyActivity.add(WeeklyActivity(day, listOfActivity))
        }
    }
    val scheduler = Scheduler(id, title, listOfWeeklyActivity)
    return scheduler
}

推荐阅读