Kotlin解析Assets中JSON文件遇JsonDecodingException错误解决
解决Kotlinx.serialization解析Assets目录JSON时的JsonDecodingException错误
问题场景
在Android Kotlin项目中,使用kotlinx.serialization库解析Assets目录下的collocations.json文件时,运行时抛出JsonDecodingException,错误提示如下:
Expected start of the object '{', but had 'EOF' instead
错误原因
最初的代码直接将文件名字符串传入Json.decodeFromString()方法,而非文件的实际JSON内容。解析器尝试解析"collocations.json"这个文本,而非真正的JSON数据,自然找不到JSON对象的起始标记{,触发EOF(文件结束)错误。
解决方案
通过Assets管理器打开目标文件,读取完整的JSON文本内容后,再将内容传入反序列化方法。
代码示例
1. 序列化数据类定义
@Serializable data class CollocationGroup( val A: List<Collocation>, val B: List<Collocation>, // 其他字母分组按需定义 ) @Serializable data class Collocation( val word: String, val partners: List<String> )
2. 错误代码示例(直接传入文件名)
// 错误写法:将文件名当作JSON内容传入解析方法 val collocations = Json.decodeFromString<CollocationGroup>("collocations.json")
3. 正确代码示例(读取Assets文件内容)
// 先读取Assets文件的完整内容,再进行解析 val jsonStr: String = context.assets.open("collocations.json").bufferedReader().use { it.readText() } val collocations = Json.decodeFromString<CollocationGroup>(jsonStr)
4. 示例JSON结构(collocations.json)
{ "A": [ { "word": "abandon", "partners": ["ship", "hope"] } ], "B": [ { "word": "break", "partners": ["news", "promise"] } ] }
内容的提问来源于stack exchange,提问作者NewPartizal
相关产品推荐
相关产品推荐

