android - 如何在 Kotlin 中将 API BEGIN_ARRAY 更改为 BEGIN_OBJECT?
问题描述
这是我的服务:
class NewsAPIService {
private val BASE_URL = "http://newsapi.org/v2/"
private val api = Retrofit.Builder().baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
.create(NewsAPI::class.java)
fun getData():Single<List<news58>>{
return api.getNews()
}}
这是我的界面:
interface NewsAPI {
@GET("top-headlines?category=sports&apiKey=42862811f4c94e82988aaa326dad8f4c")
fun getNews():Single<List<news58>>
}
这是我的viewModel
:
private fun getDataFromAPI(){
newsLoading.value = true
disposible.add(
newsApiService.getData()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(object : DisposableSingleObserver<List<news58>>(){
override fun onSuccess(t: List<news58>) {
getNews.value = t
newsLoading.value = false
newsError.value = false
}
override fun onError(e: Throwable) {
newsLoading.value = false
newsError.value = true
e.printStackTrace()
}}))}
当我尝试下载数据时,出现此错误:
2020-04-07 12:48:20.148 16738-16738/com.msamil.newspaper4 W/System.err: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
2020-04-07 12:48:20.148 16738-16738/com.msamil.newspaper4 W/System.err: at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350)
我该如何解决?这是一个新的应用程序。我正在努力学习它,但它不是那样工作的。
解决方案
这个问题只是因为您从 API 响应中获取列表,但是您的响应只是向您发送了 JSONObject,而不是列表。
所以,在你的情况下,你可能必须像下面这样使用
fun getData():Single<ews58>{
return api.getNews()
}}
在您的界面中
interface NewsAPI {
@GET("top-headlines?category=sports&apiKey=42862811f4c94e82988aaa326dad8f4c")
fun getNews():Single<news58>
}
更新
视图模型
private fun getDataFromAPI(){
newsLoading.value = true
disposible.add(
newsApiService.getData()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(object : DisposableSingleObserver<news58>(){
override fun onSuccess(t: news58) {
// your code
}
override fun onError(e: Throwable) {
newsLoading.value = false
newsError.value = true
e.printStackTrace()
}}))}
推荐阅读
- amazon-web-services - 如何在应用期间使用 terraform 创建 ec2 后运行脚本?
- angular - 创建可重复使用的角垫自动完成
- javascript - 查找总计等于 N 的所有值组合(javascript)
- c# - 通过值更改触发事件 (
- python - 我想将一个表单的实例传递给另一个表单。我怎样才能做到这一点?
- python - 检查文本是否存在 2 个或多个用括号括起来的字符或数字,至少第一个字符为大写
- swift - 如果视图相同,则 TabView 生命周期问题
- javascript - Shortest Job First (Non preemptive) - 同时排序突发时间和到达时间
- javascript - 错误:无法获取 /
- javascript - Javascript html表格单元格编辑没有正确发生