Retrofit @GET请求仅获取ID字段报错,如何忽略其他响应字段?
问题:仅解析API响应中ID字段时代码报错的解决方法
我发起了一个GET API请求,响应数据如下:
{ "id": "22222", "resourceUri": "ssss", "xxx": null, "xxx": [], "phone": "kkk", "email": "jjjjjj", }
我仅需要其中的ID字段,因此创建了如下数据类:
data class ApiResponse( val id: String, )
API调用代码如下:
suspend fun apiCall(@Header("Authorization") authorization : String) :Response<ApiResponse>
但这段代码无法正常运行并抛出错误,请问该如何解决?
常见原因及解决办法
1. 序列化器默认要求匹配所有字段
多数Kotlin序列化库(如Kotlinx Serialization、Moshi、Gson)默认会校验响应中的所有字段是否都能被数据类映射,未声明的字段会触发解析错误。
对应解决方式:
- Kotlinx Serialization:给数据类添加
@Serializable和@JsonIgnoreUnknownKeys注解,同时在序列化器配置中开启忽略未知字段:
import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonIgnoreUnknownKeys @Serializable @JsonIgnoreUnknownKeys data class ApiResponse( val id: String, ) // Retrofit配置示例 val json = Json { ignoreUnknownKeys = true } Retrofit.Builder() .addConverterFactory(KotlinxSerializationConverterFactory(json)) // 其他配置(baseUrl等)
- Moshi:给数据类加
@JsonClass(generateAdapter = true),并在构建Moshi实例时添加宽松解析拦截器:
import com.squareup.moshi.JsonClass import com.squareup.moshi.Lenient @JsonClass(generateAdapter = true) data class ApiResponse( val id: String, ) // Retrofit配置示例 val moshi = Moshi.Builder() .add(Lenient()) .build() Retrofit.Builder() .addConverterFactory(MoshiConverterFactory.create(moshi)) // 其他配置
- Gson:Gson默认忽略未知字段,但如果开启了严格模式会报错,确保使用默认Gson实例即可:
Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create()) // 其他配置
2. 响应JSON存在格式问题
你的响应里有两个同名的xxx字段,且最后一个字段末尾多了逗号,这不符合JSON规范,严格的序列化器会解析失败。
- 优先要求后端修复响应格式,移除重复字段和末尾逗号;
- 临时方案:使用支持宽松解析的序列化配置(如Kotlinx Serialization开启
isLenient = true,Moshi添加Lenient()拦截器)。
内容的提问来源于stack exchange,提问作者sina .s
相关产品推荐
相关产品推荐

