我正在尝试从coinmarket API获取前10枚硬币。突出显示了下面代码中出现错误的部分。我不明白为什么它会导致我的应用程序崩溃。请帮忙!
private fun loadFirst10Coin(){
client = OkHttpClient()
request = Request.Builder()
.url(String.format("https://api.coinmarketcap.com/v1/ticker/?start=0&limit=10"))
.build()
client.newCall(request)
.enqueue(object: Callback
{
override fun onFailure(call: Call, e: IOException) {
Log.d("Error", e.toString())
}
override fun onResponse(call: Call, response: Response) {
val body = response?.body!!.string()
val gson = Gson()
//This line is giving me error//
**items = gson.fromJson(body, object: TypeToken<List<CoinModel>>() {}.type)**
runOnUiThread{
adapter.updateData(items)
}
}
})
}
这就是我的logcat的外观
2022-01-27 16:14:01.224 22322-14470/com.example.cryptocheck E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
Process: com.example.cryptocheck, PID: 22322
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $
at com.google.gson.Gson.fromJson(Gson.java:975)
at com.google.gson.Gson.fromJson(Gson.java:928)
at com.google.gson.Gson.fromJson(Gson.java:877)
at com.example.cryptocheck.MainActivity$loadFirst10Coin$1.onResponse(MainActivity.kt:81)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1 path $
at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:349)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:80)
at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
at com.google.gson.Gson.fromJson(Gson.java:963)
您得到的错误是因为字符串不是从"[〃.
友情提醒:您不应该再使用GSON了。项目维护人员之一Jake Wharton建议使用Moshi、Jackson或kotlin.serialization
此格式的所有错误
预期为_______,但在第__行第__列处为______
与反序列化错误有关。
这意味着你通过网络调用获得的数据是一种特定的格式,你将其解析为其他内容。
在你的情况下";应为BEGIN_ARRAY,但却是STRING";意味着您的JSON响应以"["开头,但您将其解析为字符串。
将Reform与合适的转换器工厂(GSON、Moshi、Jackson等(结合使用,并将json响应以数据类的形式与json之类的插件一起使用到Kotlin class,将大大减少这些错误。
此外,端点可能会返回其他内容,而不是预期的JSON(例如HTML(,因此使用网络库将使处理更容易
我也遇到过同样的问题。您得到的响应已损坏或不符合您的解析方法。您应该检查响应格式。