Kotlin调用GitHub Gists API返回200但无法获取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

