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
相关产品推荐
相关产品推荐

