You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何逐个遍历JSON数组字段并获取对应值?

解决Kotlin中JSON数组元素逐个获取的问题

你的代码当前是将所有regDt值直接拼接成连续字符串,要逐个获取并处理这些结果,可通过以下几种方式实现:

1. 将结果存储到列表(推荐,便于后续灵活处理)

在循环外部定义一个列表,循环时将每个regDt存入列表,之后就能通过索引或遍历逐个访问:

val response = ... // 接口返回的字符串
val jsonObj = JSONObject(response)
val jsonArray = jsonObj.optJSONArray("data")

val regDtList = mutableListOf<String>() // 定义存储列表
if (jsonArray != null) {
    for (i in 0 until jsonArray.length()) {
        val jsonObject = jsonArray.getJSONObject(i)
        val regDt = jsonObject.optString("regDt")
        regDtList.add(regDt) // 将单个日期存入列表
    }
}

// 逐个获取示例
regDtList.forEachIndexed { index, dt ->
    println("第${index+1}个日期:$dt")
    // 这里可以对单个日期进行自定义处理
}

2. 循环内直接处理单个元素

如果不需要保存所有结果,可在循环过程中直接处理每个regDt:

if (jsonArray != null) {
    for (i in 0 until jsonArray.length()) {
        val jsonObject = jsonArray.getJSONObject(i)
        val regDt = jsonObject.optString("regDt")
        // 直接处理当前regDt
        println("当前日期:$regDt")
        // 比如更新UI、存入数据库等操作
    }
}

3. 在TextView中分隔显示(保留拼接但区分元素)

如果只是希望在TextView里让各个日期分开显示,可在拼接时添加分隔符(如换行、逗号):

val startDateTV = StringBuilder()
if (jsonArray != null) {
    for (i in 0 until jsonArray.length()) {
        val jsonObject = jsonArray.getJSONObject(i)
        val regDt = jsonObject.optString("regDt")
        startDateTV.append(regDt).append("\n") // 用换行分隔
        // 或用逗号分隔:startDateTV.append(regDt).append(", ")
    }
    // 移除最后一个多余的分隔符(如果用逗号的话)
    if (startDateTV.isNotEmpty()) {
        startDateTV.deleteCharAt(startDateTV.length - 1)
    }
    startDate.text = startDateTV.toString()
}

4. 用Gson解析为数据类(更优雅的JSON处理方式)

手动操作JSONObject容易出错,建议用Gson将JSON直接解析为数据类,之后直接操作列表元素:
首先定义对应的数据类:

data class HistoryItem(
    val status: String,
    val regDt: String,
    val seq: String
)

data class HistoryResponse(
    val data: List<HistoryItem>
)

然后替换原有的JSON解析逻辑:

val response = ... // 接口返回的字符串
val historyResponse = Gson().fromJson(response, HistoryResponse::class.java)
val historyItems = historyResponse.data

// 逐个处理元素
historyItems.forEach { item ->
    println("日期:${item.regDt},状态:${item.status}")
}

// 拼接为带分隔的字符串显示在TextView
startDate.text = historyItems.joinToString("\n") { it.regDt }

内容的提问来源于stack exchange,提问作者andi azamuddin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:30:58