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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:20:34