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

如何用Gson解析含数组的JSON文件(结合Android Ion库)

解决方案:将JsonObject转换为列表的列表

嘿,这事儿好办!既然你已经用Ion成功获取到了Gson的JsonObject,接下来只需要几步就能把它转成你要的列表的列表(List<List<String>>),而且这个方案还能完美兼容未来新增的数组,完全不用改代码~

核心思路

你的JSON结构是「一个包含多个数组的对象」,每个键对应一个字符串数组。我们只需要:

  1. 遍历JsonObject的所有键值对
  2. 把每个键对应的JsonArray转换成List<String>
  3. 将所有List<String>收集到一个大列表里

具体代码实现

下面是完整的回调代码,我给你写了两种风格:一种是清晰的分步写法,另一种是更简洁的Kotlin函数式写法,你可以按需选择。

写法一:分步清晰版

import com.google.gson.JsonArray
import com.google.gson.JsonObject

// 替换你原来的回调实现
override fun onCompleted(e: Exception?, result: JsonObject?) {
    // 先处理请求错误
    if (e != null) {
        e.printStackTrace() // 或者做自定义错误处理,比如提示用户
        return
    }

    result?.let { jsonObject ->
        // 初始化最终的列表的列表
        val listOfLists = mutableListOf<List<String>>()

        // 遍历JsonObject里的每一组键值对
        for ((_, jsonArray) in jsonObject.entrySet()) {
            val stringList = mutableListOf<String>()
            // 把当前JsonArray里的每个元素转成String并加入列表
            for (element in jsonArray.asJsonArray) {
                stringList.add(element.asString)
            }
            // 将这个String列表加入总列表
            listOfLists.add(stringList)
        }

        // 现在listOfLists就是你要的结果啦!
        // 这里可以写你的业务逻辑,比如打印结果测试
        listOfLists.forEach { println("当前列表:$it") }
    }
}

写法二:Kotlin函数式简洁版

如果你喜欢更紧凑的代码,可以用Kotlin的map链式调用:

import com.google.gson.JsonArray
import com.google.gson.JsonObject

override fun onCompleted(e: Exception?, result: JsonObject?) {
    if (e != null) {
        e.printStackTrace()
        return
    }

    result?.let { jsonObject ->
        // 一行代码完成转换
        val listOfLists = jsonObject.entrySet()
            .map { entry ->
                entry.value.asJsonArray.map { element -> element.asString }
            }

        // 使用转换后的结果
        listOfLists.forEach { println("当前列表:$it") }
    }
}

扩展性说明

这个方案完全适配你提到的「未来可能新增更多数组」的需求——不管以后JSON里加多少个新的键(比如"Angry"、"Calm"之类的),代码都会自动把对应的数组转成列表并加入总列表,不需要做任何修改。

可选容错优化(非必需)

如果担心未来JSON里出现非字符串类型的元素,可以加个判断避免崩溃:

// 在转换单个元素时加入判断
if (element.isJsonPrimitive && element.asJsonPrimitive.isString) {
    stringList.add(element.asString)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:36:28