如何用Gson解析含数组的JSON文件(结合Android Ion库)
解决方案:将JsonObject转换为列表的列表
嘿,这事儿好办!既然你已经用Ion成功获取到了Gson的JsonObject,接下来只需要几步就能把它转成你要的列表的列表(List<List<String>>),而且这个方案还能完美兼容未来新增的数组,完全不用改代码~
核心思路
你的JSON结构是「一个包含多个数组的对象」,每个键对应一个字符串数组。我们只需要:
- 遍历
JsonObject的所有键值对 - 把每个键对应的
JsonArray转换成List<String> - 将所有
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
相关产品推荐
相关产品推荐

