0

0

如何在 Retrofit GET 请求中忽略 API 响应中的多余字段

碧海醫心

碧海醫心

发布时间:2026-01-07 23:13:01

|

794人浏览过

|

来源于php中文网

原创

如何在 Retrofit GET 请求中忽略 API 响应中的多余字段

retrofit 默认支持“按需映射”——只需在数据类中声明需要的字段,gson 会自动忽略 json 中其他未声明的字段,无需额外配置。若出现解析错误,通常源于 gson 配置、空值处理或类型不匹配等问题。

在使用 Retrofit 进行 @GET 请求时,你完全不需要为响应 JSON 中的每一个字段都定义对应的 Kotlin 属性。正如你的用法所示:

data class ApiResponse(
    val id: String,
)

配合如下接口定义:

interface ApiService {
    @GET("your/endpoint")
    suspend fun apiCall(@Header("Authorization") authorization: String): Response
}

✅ 这是完全合法且推荐的做法——Gson(默认 Converter)会自动跳过 resourceUri、xxx、phone、email 等未声明字段,仅将 "id" 字段反序列化到 ApiResponse.id。

⚠️ 但若运行时报错(如 JsonParseException、NullPointerException 或 IllegalArgumentException),常见原因及解决方案如下:

✅ 1. 确保已正确添加 GsonConverterFactory

Retrofit 必须显式注册 Gson 转换器(尤其在自定义 OkHttpClient 或多模块项目中易被遗漏):

val retrofit = Retrofit.Builder()
    .baseUrl("https://api.example.com/")
    .addConverterFactory(GsonConverterFactory.create()) // ← 关键!不可省略
    .build()

✅ 2. 处理可能的 null 值(避免 String 类型接收 null)

你的示例中 xxx 字段可能为 null 或 [],但 ApiResponse 未包含它,这本身不会报错。但如果某必需字段(如 id)在某些响应中为 null,而你将其声明为非空 String,就会触发 JsonParseException。

✅ 推荐写法(安全适配空值):

360智图
360智图

AI驱动的图片版权查询平台

下载
data class ApiResponse(
    val id: String?, // 允许 null
    // 其他按需字段...
)

或使用 @Nullable 注解(需启用 Gson 的 setLenient() 或 serializeNulls() —— 一般不推荐,优先用可空类型)。

✅ 3. 检查字段名与 JSON key 是否严格匹配(含大小写)

Gson 默认按字段名精确匹配。若服务端返回 "ID" 或 "Id",而你写的是 val id: String,则无法映射。此时需使用 @SerializedName:

data class ApiResponse(
    @SerializedName("id") 
    val id: String?,
)

✅ 4. 排查网络层或 Mock 干扰(如你示例中用了 Retromock)

你提供的代码片段中使用了 Retromock(非标准库),其 @MockResponse 若 JSON 格式非法(如逗号缺失、引号不闭合),会导致解析失败。请验证 mock body 是否为有效 JSON:

{"id":"22222","resourceUri":"ssss","xxx":null,"xxx":[],"phone":"kkk","email":"jjjjjj"}
? 提示:该 JSON 中存在重复 key "xxx"(JSON 规范允许但 Gson 默认只取最后一个),建议服务端修复;若无法修改,可改用 Map + 手动提取,或自定义 TypeAdapter。

✅ 最小可运行示例(验证基础流程)

// 数据类(极简)
data class ApiResponse(val id: String?)

// 接口
interface ApiService {
    @GET("test")
    suspend fun fetchId(@Header("Authorization") token: String): Response
}

// 调用
val response = apiService.fetchId("Bearer abc123")
if (response.isSuccessful && response.body()?.id != null) {
    println("Received ID: ${response.body()!!.id}")
} else {
    println("Error: ${response.code()} ${response.message()}")
}

? 总结:你最初的实现思路完全正确。Retrofit + Gson 天然支持“忽略无关字段”。出错时,请优先检查:

  • GsonConverterFactory 是否已添加;
  • 必需字段是否可能为 null(改用可空类型);
  • 字段命名是否与 JSON key 一致(注意大小写和下划线);
  • Mock 或真实响应 JSON 是否语法合法、无歧义 key。

无需引入 @JsonIgnore、自定义解析器或复杂配置——简洁即强大。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

406

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

531

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

435

2024.03.01

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1006

2023.10.19

java学习网站推荐汇总
java学习网站推荐汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.2万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号