使用Kotlin解析嵌套JSON数组/对象时如何获取class_name值
原生Kotlin解析嵌套JSON获取class_name实现方案
核心逻辑
你要获取的class_name字段位于三层结构下:
- 根节点的
childScoresList数组(你已经遍历到这层) - 该数组每个元素下嵌套的
classes数组 classes数组的每个对象里就存着class_name字段
只需要在你现有遍历逻辑的基础上,逐层向下取出嵌套数组、继续遍历即可,不需要依赖任何第三方库。
待解析JSON结构
{ "childScoresList": [ { "child_id": "1", "score_date": "2022-03-27", "category_id": "1", "category_name": "Preschool Math", "classes": [ { "category_name": "Preschool Math", "class_name": "Number Blocks", "class_id": "1", "class_description": "Ones, Tens, Hundreds Blocks used to create given numbers.", "skills": [ { "skill_id": "1", "skill_name": "Place Value", "skill_description": "Knowing the place value of specific elements.", "skill_score": "50" } ] } ] } ] }
完整实现代码
val rootObj = JSONObject(response.toString()) val childScoresArray = rootObj.getJSONArray("childScoresList") for (i in 0 until childScoresArray.length()) { val scoreItem = childScoresArray.getJSONObject(i) // 原有逻辑:获取一级节点的category_name val categoryName = scoreItem.getString("category_name") // 取出当前节点下嵌套的classes数组 val classesArray = scoreItem.getJSONArray("classes") for (j in 0 until classesArray.length()) { val classItem = classesArray.getJSONObject(j) // 成功获取嵌套的class_name字段 val className = classItem.getString("class_name") // 如果需要取更下层的skills字段,按相同逻辑继续向下遍历即可 val skillsArray = classItem.getJSONArray("skills") for (k in 0 until skillsArray.length()) { val skillItem = skillsArray.getJSONObject(k) val skillScore = skillItem.getString("skill_score") } } }
注意事项
- 解析时严格按照JSON的层级逐层取值,不要跨层级直接取深层字段,否则会抛出字段不存在的异常
- 如果实际业务中JSON结构可能存在字段缺失的情况,建议将
getString/getJSONArray替换为optString/optJSONArray系列方法,支持设置默认值,字段不存在时不会直接崩溃:// 字段不存在时返回空字符串,不会崩溃 val className = classItem.optString("class_name", "") // 字段不存在时返回null,遍历前先判空即可 val classesArray = scoreItem.optJSONArray("classes")
内容的提问来源于stack exchange,提问作者Lewis
相关产品推荐
相关产品推荐

