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类。
1条答案
按热度按时间kx5bkwkv1#
您指定
Call<List<nutritionData>>
作为API调用的返回类型,这意味着JSON数据必须如下所示:字符串
然而,JSON数据实际上只是一个JSON对象,它直接表示您的
nutritionData
:型
因此,您应该将
Call<List<nutritionData>>
更改为Call<nutritionData>
。这也是Gson异常消息的意思:您指定类型为
List<...>
,因此Gson需要一个 *JSON数组 *,但JSON数据实际上以 *JSON对象 * 开始。异常的位置信息“line 1 column 2 path $”将您指向JSON数据中的错误位置(可能有一些轻微的不准确)。