gson 如何在Retrofit中将数据类与API的JSON响应进行匹配?

e5njpo68  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(104)
data class Item(
    val calories: Int,
    val carbohydrates_total_g: Double,
    val cholesterol_mg: Int,
    val fat_saturated_g: Int,
    val fat_total_g: Double,
    val fiber_g: Double,
    val name: String,
    val potassium_mg: Int,
    val protein_g: Double,
    val serving_size_g: Int,
    val sodium_mg: Int,
    val sugar_g: Double
)

data class nutritionData(
    val items: List<Item>
)

val client = OkHttpClient.Builder()
.addInterceptor { chain ->
    val request = chain.request()
        .newBuilder()
        .addHeader("X-Api-Key", ApiHeaders.API_KEY)
        .build()
    chain.proceed(request)
}
.build()

interface NinjaAPI {

    @GET("v1/nutrition?")
    fun getNutrition(@Query("query") foodName: String): Call<List<nutritionData>>
}

    const val BASE_URL = "https://api.calorieninjas.com/"
fun getMyNutrition(foodName: String) {

    val retrofitBuilder = Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create())
        .baseUrl(BASE_URL)
        .client(client)
        .build()
        .create(NinjaAPI::class.java)

    val retrofitData = retrofitBuilder.getNutrition(foodName)
    retrofitData.enqueue(object : Callback<List<nutritionData>?> {
        override fun onResponse(
            call: Call<List<nutritionData>?>,
            response: Response<List<nutritionData>?>
        ) {
            Log.d(TAG, "IT WORKED")
        }

        override fun onFailure(call: Call<List<nutritionData>?>, t: Throwable) {
            Log.d(TAG, "onFailure: " + t.message)
        }
    })
}

字符串
我尝试了一切来显示(卡路里,脂肪,蛋白质和碳水化合物)从CaloriesNinja API,但我不能,我试图检查目录的信息,原来onRespons e从未发生过,所有的按钮点击转到onFailure并产生:
onFailure:应为开始_ARRAY,但在第1行第2列路径$处为BEGIN_OBJECT
我在谷歌上搜索了一下,这是我从API中格式化的数据,但我复制了他们的响应示例,并使用插件将其转换为Kotlin类。

kx5bkwkv

kx5bkwkv1#

您指定Call<List<nutritionData>>作为API调用的返回类型,这意味着JSON数据必须如下所示:

[
  {
    "items": [ ... ]
  },
  {
    "items": [ ... ]
  },
  ...
]

字符串
然而,JSON数据实际上只是一个JSON对象,它直接表示您的nutritionData

{
  "items": [ ... ]
}


因此,您应该将Call<List<nutritionData>>更改为Call<nutritionData>
这也是Gson异常消息的意思:您指定类型为List<...>,因此Gson需要一个 *JSON数组 *,但JSON数据实际上以 *JSON对象 * 开始。异常的位置信息“line 1 column 2 path $”将您指向JSON数据中的错误位置(可能有一些轻微的不准确)。

相关问题