【问题标题】:Android Expected BEGIN_OBJECT but was BEGIN_ARRAYAndroid 应为 BEGIN_OBJECT 但为 BEGIN_ARRAY
【发布时间】:2020-10-23 07:37:15
【问题描述】:

当我启动我的应用程序时,我不断收到此错误。我不知道为什么会出现此错误,因为我的 Response 类在构造函数中有列表。我看到了这个link,但我没有找到我的问题的答案。我正在使用 json server 作为虚拟 RESTful api。

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.social.network, PID: 3448
    com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:40)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
        at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:243)
        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:153)
        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:174)
        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
        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:929)
     Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
        at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:215)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:40) 
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27) 
        at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:243) 
        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:153) 
        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:174) 
        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 
        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:929) 
I/Process: Sending signal. PID: 3448 SIG: 9

这是我的 Api 接口:

interface Api {

    companion object {
        const val BASE_URL = "http://be7c232bf30e.ngrok.io "
    }

    @GET("/posts")
    suspend fun searchPhotos(
        @Query("_page") page: Int,
        @Query("_limit") perPage: Int
    ): Response
}

这是响应数据类:

data class Response(
    val results: List<Post>
)

【问题讨论】:

    标签: android kotlin mvvm retrofit2


    【解决方案1】:

    您可能应该返回Post 的列表或Response 的列表

    
    interface Api {
    
        companion object {
            const val BASE_URL = "http://be7c232bf30e.ngrok.io "
        }
    
        @GET("/posts")
        suspend fun searchPhotos(
            @Query("_page") page: Int,
            @Query("_limit") perPage: Int
        ): List<Post> // or List<Response>
    }
    

    【讨论】:

    • 我无法返回 PostResponse 的列表,因为我有 PagingSource 类进行处理,所以我需要从 Response 类访问 resultparameter
    • 您不能只将响应本身指向 PagingSource 吗?
    • @MariuszBrona 你能帮忙吗 --> stackoverflow.com/questions/64495233/…
    猜你喜欢
    • 2017-05-22
    • 1970-01-01
    • 2018-01-12
    • 2018-04-24
    • 2016-12-27
    • 2013-08-10
    • 1970-01-01
    • 2017-10-16
    相关资源
    最近更新 更多