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

Kotlin调用GitHub Gists API返回200但无法获取JSON响应体问题

解决Retrofit获取GitHub Gists JSON数据失败的问题

嘿,我看了你的问题和代码,发现几个关键的小问题,导致你拿到了200 OK的响应却没法获取到实际的JSON内容,咱们一步步来修正:

1. 数据类命名与结构不匹配

你定义的数据类叫CVResponse,但Retrofit接口里用的泛型是NewResponse,这俩完全对不上啊!而且你的目标JSON结构有多层嵌套,你只定义了最外层的data字段,却没把内部的Data、skills、education_bg对应的嵌套类写出来,Gson根本没法正确解析。

修正后的完整数据类(统一用NewResponse和接口对应,或者你也可以把接口里的泛型改成CVResponse,保持一致就行):

import com.google.gson.annotations.SerializedName

data class NewResponse(
    @SerializedName("data")
    val data: Data? = null
)

data class Data(
    val name: String? = null,
    val summary: String? = null,
    val skills: List<Skill>? = null,
    @SerializedName("education_bg")
    val educationBg: List<EducationBg>? = null
)

data class Skill(
    val type: String? = null,
    val languages: List<String>? = null
)

data class EducationBg(
    val position: String? = null,
    val Major: String? = null,
    val from: String? = null,
    val to: String? = null,
    @SerializedName("institute_name")
    val instituteName: String? = null
)

注意:JSON里的education_bg和institute_name是下划线命名,Kotlin里用驼峰的话必须加@SerializedName来映射,否则Gson会解析失败。

2. 没有正确获取响应体内容

你在onResponse里打印的是response.raw().toString(),这玩意儿只是打印了响应的元数据(比如协议、状态码、URL这些),完全没去读取实际的响应体内容。正确的做法是先判断请求是否成功,再通过response.body()拿到Gson解析好的对象。

修正后的onResponse方法:

override fun onResponse(call: Call<NewResponse>, response: Response<NewResponse>) {
    if (response.isSuccessful) {
        // 拿到解析后的响应对象
        val responseData = response.body()
        responseData?.let {
            // 这里可以自由获取你需要的数据了
            Log.d("tag", "姓名:${it.data?.name}")
            Log.d("tag", "个人简介:${it.data?.summary}")
            
            // 打印技能列表
            it.data?.skills?.forEach { skill ->
                Log.d("tag", "技能类型:${skill.type},包含:${skill.languages?.joinToString(", ")}")
            }
            
            // 打印教育背景
            it.data?.educationBg?.forEach { education ->
                Log.d("tag", "学历:${education.position},院校:${education.instituteName}")
            }
        }
    } else {
        // 请求成功但状态码不是200的情况
        Log.e("tag", "请求失败,状态码:${response.code()}")
    }
}

3. 确保接口与数据类统一

你的RequestApi接口里返回的是Call<NewResponse>,所以一定要保证数据类的名字是NewResponse,或者把接口里的泛型改成Call<CVResponse>,两者必须完全一致,不然Retrofit不知道该用哪个类来解析。

另外,别忘了检查AndroidManifest.xml里是否添加了网络权限:

<uses-permission android:name="android.permission.INTERNET"/>

没有这个权限的话,网络请求根本发不出去。

按照上面的步骤修改后,你应该就能正常获取到Gists里的JSON数据啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:23:55