Android开发:Kotlin无法导入本地JSON文件(明确路径仍失效)
解决Android Studio中Kotlin无法读取本地JSON/TXT文件的问题
我帮你梳理下Android里读取本地文件最容易踩的几个坑,你对照着排查下:
1. 文件放错位置了!这是最常见的问题
Android应用只会打包特定目录下的资源文件,如果你把JSON/TXT随便放在项目根目录或者res的非指定文件夹里,JVM肯定找不到它。正确的做法是二选一:
方案A:放在assets目录
- 右键项目里的
main文件夹 → New → Folder → Assets Folder,直接点击Finish创建 - 把你的JSON/TXT文件拖进这个assets文件夹里(支持子目录,比如
assets/data/user.json)
方案B:放在res/raw目录
- 右键
res文件夹 → New → Raw Resource File,输入文件名(比如data.json) - 注意:raw目录里的文件不能有子目录,文件名也不能包含特殊字符(比如空格、中文)
2. 别用JVM的File类读取!适配Android沙盒机制
Android应用有自己的沙盒权限,你用File("/xxx/xxx.json")这种绝对路径读取是行不通的,必须用Android提供的AssetManager或者Resources来读取内部资源。
读取assets目录文件的代码示例
fun loadFileFromAssets(context: Context, fileName: String): String? { return try { // 通过AssetManager打开文件流 val inputStream = context.assets.open(fileName) // 获取文件大小并读取到字节数组 val size = inputStream.available() val buffer = ByteArray(size) inputStream.read(buffer) inputStream.close() // 转成UTF-8字符串返回 String(buffer, Charsets.UTF_8) } catch (ex: IOException) { ex.printStackTrace() null } }
读取raw目录文件的代码示例
fun loadFileFromRaw(context: Context, resId: Int): String? { return try { val inputStream = context.resources.openRawResource(resId) val size = inputStream.available() val buffer = ByteArray(size) inputStream.read(buffer) inputStream.close() String(buffer, Charsets.UTF_8) } catch (ex: IOException) { ex.printStackTrace() null } }
3. 文件名大小写/拼写要严格匹配
Android的文件系统是大小写敏感的!比如你代码里写的是"Data.json",但实际文件是"data.json",或者文件名多打了一个空格,都会导致找不到文件。建议文件名全用小写,用下划线分隔(比如user_list.json)。
4. 确认文件真的被打包进APK了
有时候Android Studio同步不及时,文件没被打包进去。你可以这么检查:
- 点击顶部菜单栏的Build → Analyze APK
- 选择你刚构建的APK文件,打开后看看
assets或者res/raw目录下有没有你的文件 - 如果没有,执行Build → Clean Project,然后再Build → Rebuild Project,重新打包一次
关于Klaxon的额外提示
你提到Parser类被弃用,现在Klaxon推荐直接用Klaxon().parse方法来解析JSON字符串,举个简单例子:
// 先定义你的数据类 data class User(val name: String, val age: Int) // 读取到JSON字符串后解析 val jsonString = loadFileFromAssets(context, "users.json") jsonString?.let { val userList = Klaxon().parse<List<User>>(it) // 这里处理解析后的用户列表 }
内容的提问来源于stack exchange,提问作者Nicholas Bennett
相关产品推荐
相关产品推荐

