错误:预期为BEGIN_ARRAY,但在第1行第2列路径$处为BEGIN_OBJECT

问题描述

当我尝试读取json时出现错误

Json

    {
       "pratos":[
          {
             "IDITENS_vendA":539,"DESCRICAO_PRODUTO":"X BAICON","ITENS_vendA_QUANTIDADE":1,"PRECOvendA_PRODUTO":14.5,"vendAS_VALOR_vendA":97
          },{
             "IDITENS_vendA":540,"DESCRICAO_PRODUTO":"ESPETINHO","PRECOvendA_PRODUTO":55,"vendAS_VALOR_vendA":97
          }
       ]
    }

Api

@GET("itens_mesa")
    fun ListItensMesa(@Query("idmesas")idmesas : String?):Observable<List<Itens_Mesa>>

class

class Itens_Mesa(
    @Serializedname("DESCRICAO_PRODUTO")
    val DESCRICAO_PRODUTO : String,@Serializedname("ITENS_vendA_QUANTIDADE")
    val ITENS_vendA_QUANTIDADE : String,@Serializedname("PRECOvendA_PRODUTO")
    val PRECOvendA_PRODUTO : Double,@Serializedname("COMPLEMENTO_DESCRICAO")
    val COMPLEMENTO_DESCRICAO : String,@Serializedname("COMPLEMENTO_VALOR")
    val COMPLEMENTO_VALOR : Double,@Serializedname("IDITENS_vendA")
    val IDITENS_vendA : String,@Serializedname("vendAS_VALOR_vendA")
    val vendAS_VALOR_vendA : Double,@Serializedname("Resposta")
    val Resposta : String
)

function Lista_Itens(){
        disposable =  client.ListItensMesa(idmesas)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                { result -> Log.e(" Result ",result[0].DESCRICAO_PRODUTO) },{ error -> println(" Erro não esperado! " + error.printstacktrace()) }
            )
}

我在做什么错了?

当我以这种方式阅读json时,它会完美运行

[
    {
        "IDITENS_vendA": 539,"DESCRICAO_PRODUTO": "X BAICON","ITENS_vendA_QUANTIDADE": 1,"PRECOvendA_PRODUTO": 14.5,"vendAS_VALOR_vendA": 97
    },{
        "IDITENS_vendA": 540,"DESCRICAO_PRODUTO": "ESPETINHO","PRECOvendA_PRODUTO": 55,"vendAS_VALOR_vendA": 97
    }
]

解决方法

您期望使用“ Itens_Mesa”对象的列表,但是在JSON中,您的对象列表是另一个对象的属性。如果您可以更改API调用,则可以像在此所做的那样更改响应。

[
    {
        "IDITENS_VENDA": 539,"DESCRICAO_PRODUTO": "X BAICON","ITENS_VENDA_QUANTIDADE": 1,"PRECOVENDA_PRODUTO": 14.5,"VENDAS_VALOR_VENDA": 97
    },{
        "IDITENS_VENDA": 540,"DESCRICAO_PRODUTO": "ESPETINHO","PRECOVENDA_PRODUTO": 55,"VENDAS_VALOR_VENDA": 97
    }
]

如果您无法更改API调用,请按照以下方式定义另一个类,

class Itens_Mesa_List_Object(
    @SerializedName("pratos")
    val INTENSE_MESA_LIST : List<Itens_Mesa>
)

按以下方式更改您的通话

**Api**
@GET("itens_mesa")
fun ListItensMesa(@Query("idmesas")idmesas: String?):Observable<Itens_Mesa_List_Object>

然后您可以像这样打印结果

{ 
    result -> Log.e(" Result ",result.INTENSE_MESA_LIST[0].DESCRICAO_PRODUTO )
}
,

感谢您对我的帮助。但是我仍然有以下疑问,以及json是否大于2 []。它将如何工作?

示例2杰森

[
    {
        "pratos": [
            {
                "IDITENS_VENDA": 539,"VENDAS_VALOR_VENDA": 97
            },{
                "IDITENS_VENDA": 540,"VENDAS_VALOR_VENDA": 97
            }
        ]
    },{
        "complementos": [
            {
                "IDITENS_COMPLEMENTO": 546,"ITENS_IDPEDIDOS": 533,"ITENS_IDCOMPLEMENTO": 16,"COMPLEMENTO_DESCRICAO": "COM BIFÉ","COMPLEMENTO_VALOR": 8.5
            },{
                "IDITENS_COMPLEMENTO": 547,"ITENS_IDCOMPLEMENTO": 15,"COMPLEMENTO_DESCRICAO": "COM FEIJOADA","COMPLEMENTO_VALOR": 5.5
            },{
                "IDITENS_COMPLEMENTO": 548,"ITENS_IDCOMPLEMENTO": 7,"COMPLEMENTO_DESCRICAO": "OVO","COMPLEMENTO_VALOR": 1.5
            },{
                "IDITENS_COMPLEMENTO": 549,"ITENS_IDCOMPLEMENTO": 6,"COMPLEMENTO_DESCRICAO": "BACON","COMPLEMENTO_VALOR": 3.5
            },{
                "IDITENS_COMPLEMENTO": 550,"ITENS_IDCOMPLEMENTO": 17,"COMPLEMENTO_DESCRICAO": "COM ACOMPANHAMENTO","COMPLEMENTO_VALOR": 8.5
            }
        ]
    }
]

我为每个[]创建了一个单独的类。但这不起作用

class Itens_Mesa(
    @SerializedName("IDITENS_VENDA")
    val IDITENS_VENDA : String,@SerializedName("DESCRICAO_PRODUTO")
    val DESCRICAO_PRODUTO : String,@SerializedName("ITENS_VENDA_QUANTIDADE")
    val ITENS_VENDA_QUANTIDADE : String,@SerializedName("PRECOVENDA_PRODUTO")
    val PRECOVENDA_PRODUTO : Double,@SerializedName("VENDAS_VALOR_VENDA")
    val VENDAS_VALOR_VENDA : Double
) {
    class Itens_Mesa_Pratos(
        @SerializedName("pratos")
        @Expose(serialize = false)
        val MESA_LIST_PRATOS: List<Itens_Mesa>
    )
}

Api

 @GET("itens_mesa")
    fun ListItensMesa(@Query("idmesas")idmesas : String?):Observable<Itens_Mesa.Itens_Mesa_Pratos>

功能

fun Lista_Itens(){
        disposable =  client.ListItensMesa(idmesas)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                { result ->
                    Log.e(" Result ",result.INTENSE_MESA_LIST[0].DESCRICAO_PRODUTO)
//                    viewadapter = Itens_Mesa_Adapter(result.MESA_LIST_PRATOS,this)
                    recyclerViewItens_Mesa.adapter = viewadapter
                },{
                    error ->
                    println(" Erro não esperado! " + error.printStackTrace())
                })
    }

读取Json错误

W/System.err: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 3 path $
W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
        at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:225)
        at retrofit2.OkHttpCall.execute(OkHttpCall.java:188)
        at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:45)
        at io.reactivex.Observable.subscribe(Observable.java:12051)
        at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
        at io.reactivex.Observable.subscribe(Observable.java:12051)
        at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
W/System.err:     at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:579)
        at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
        at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
        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:919)
    Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 3 path $
        at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:215)
        ... 17 more