问题描述
当我尝试读取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