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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:33:54