Kotlin中Retrofit调用Open Food Facts API无法返回部分数据
解决Retrofit调用Open Food Facts API部分字段返回null/0的问题
问题根源
你遇到的问题是API返回的字段结构和数据类不匹配:Open Food Facts API返回的product_name、origins、energy_100g并非和code、status处于同一层级,而是嵌套在product对象内部。你的Post数据类直接声明这些字段,导致Gson无法找到对应值,只能返回默认值(null或0)。
修正步骤
1. 调整数据类结构,匹配API嵌套层级
创建嵌套的Product数据类,让Post类包含product对象:
package com.example.commandercalorie data class Post( val code: String, val status: Int, val product: Product? // 用可空类型避免字段缺失时解析失败 ) data class Product( val product_name: String?, val origins: String?, val energy_100g: Int? )
2. 修改数据获取逻辑,从嵌套对象取值
在回调中,需要通过post?.product访问目标字段:
override fun onResponse(call: Call<Post>, response: Response<Post>) { if (response.isSuccessful) { val post = response.body() val productName = post?.product?.product_name val origins = post?.product?.origins val energyPer100g = post?.product?.energy_100g // 后续业务逻辑处理 } else { // 处理请求失败场景 } }
3. 可选优化:规范变量命名(用Gson映射)
如果想让Kotlin代码使用驼峰命名规范,同时匹配API的蛇形命名字段,可以添加@SerializedName注解:
import com.google.gson.annotations.SerializedName data class Product( @SerializedName("product_name") val productName: String?, @SerializedName("origins") val origin: String?, @SerializedName("energy_100g") val energyPer100g: Int? )
验证要点
- 确认Retrofit的Gson转换器配置正常(当前代码已添加
GsonConverterFactory,无需修改) - 核对API返回的JSON结构,确保字段层级和命名完全匹配数据类定义
内容的提问来源于stack exchange,提问作者Coolioon
相关产品推荐
相关产品推荐

