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

Kotlin从JSON文件解析Income对象列表报错的问题求助

问题分析与解决

错误原因

你遇到的JsonSyntaxException核心问题是:

  • Gson被要求解析成List<Income>(数组类型),但实际传入的JSON是顶层对象(包含Incomes字段的键值对结构),而非直接的数组。
  • 你的代码里已经通过JSONObject提取了Incomes数组,但最后仍用整个JSON字符串去解析,导致Gson读到的是对象开头的结构,而非数组开头的[,因此抛出异常。

解决方案

方案1:定义顶层数据类解析完整JSON

先创建对应整个JSON结构的数据类:

data class IncomeResponse(
    val Incomes: List<Income>
)

然后修改解析逻辑:

val fileJson = File(
    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS),
    "Income.json")
val strFileJson: String? = fileJson.readText()
// 解析成顶层对象后,直接取出内部的列表
val incomeResponse = Gson().fromJson(strFileJson, IncomeResponse::class.java)
IncomeArry = incomeResponse.Incomes

方案2:提取数组后再解析

利用你已经拿到的JSONArray,转成字符串后再解析成列表:

val fileJson = File(
    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS),
    "Income.json")
val strFileJson: String? = fileJson.readText()
val previousJsonObj = JSONObject(strFileJson)
val array = previousJsonObj.getJSONArray("Incomes")
val typeToken = object : TypeToken<List<Income>>() {}.type
// 用数组字符串解析,而非整个JSON字符串
IncomeArry = Gson().fromJson(array.toString(), typeToken)

额外注意

确保Income数据类的字段名和JSON里的键完全匹配,比如:

data class Income(
    val date: String,
    val src: String,
    val amt: Int
)

如果字段名存在大小写或命名差异,可使用@SerializedName注解指定对应JSON键,例如@SerializedName("date") val incomeDate: String。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:26:15