android - 如何在没有外部库的情况下解析包含对象列表的对象列表
问题描述
我正在练习在不使用外部库的情况下在 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 一样拥有它。
解决方案
您的问题是您只创建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
}
推荐阅读
- oauth - 是否可以修改 WSO2 令牌响应?
- ubuntu - vim 大小不是终端的全尺寸
- .net-core - 获取 Azure AD JWT 令牌以在集成测试授权时使用
- javascript - 在 Keydown 事件上它应该播放匹配的音频
- reactjs - 来自 API 的 Reactjs 头像 src
- java - 如何使用 Jackson API 解析 XML?
- python-3.x - 如何将actor输出限制在特定范围内?
- python - 当我尝试在 Windows 上安装 LocalStack 时出现此错误
- python-2.7 - EOFError 与 numpy.load()
- javascript - Highchart.js 自定义 Y 轴代码