首页 > 解决方案 > 改造抛出错误预期 BEGIN_OBJECT 但 BEGIN_ARRAY 从数组列表到列表?

问题描述

嗨,我在解析一些 json 时遇到问题。我在 Stackoverflow 上查看了其他一些解决方案,但对我的问题不太满意。我试图让一个简单的 recyleview 工作。任何建议将不胜感激。

json文件类型

[
  {
    "name": "Javi",
    "birthdate": "2018-10-17T00:00:00",
    "id": 25
  },

界面

public interface UsuariosInterface {

@GET("User")
    Call<ArrayList<UsuariosRespuesta>> obtenerListaUsuarios();
}

分离接口

public class UsuariosRespuesta {

private ArrayList<Usuarios> results;


public ArrayList<Usuarios> getResults() {
    return results;
}

public void setResults(ArrayList<Usuarios> results) {
    this.results = results;
}}

模型

public class Usuarios {

private String name;
private String birthdate;
    private Integer id;
}

请求方法

  UsuariosInterface service = retrofit.create(UsuariosInterface.class);
    Call<ArrayList<UsuariosRespuesta>> usuariosRespuestaCall= service.obtenerListaUsuarios();

    usuariosRespuestaCall.enqueue(new Callback<ArrayList<UsuariosRespuesta>>() {
        @Override
        public void onResponse(Call<ArrayList<UsuariosRespuesta>> call, Response<ArrayList<UsuariosRespuesta>> response) {

            if (response.isSuccessful()) {

                UsuariosRespuesta usuariosRespuesta = response.body();
                ArrayList<Usuarios> listaUsuarios = usuariosRespuesta.getResults();

错误是:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

我可以理解错误是说数据是一个数组,它应该以一个对象开头,但我无法解决。

标签: javaretrofit

解决方案


如果你得到没有任何键的直接列表,那么只需在你的界面中传递列表,比如

@GET("User")
Call<UsuariosRespuesta> obtenerListaUsuarios();

但是你得到一个没有密钥的整个对象,因为你正在做响应应该是这样的 {[{},{},{},.....{}]}

 @GET("User")
   Call<UsuariosRespuesta> obtenerListaUsuarios();}

当您的数据像这样出现时,上述情况需要

{ [ { }, { } ] } 上层对象引用 thisUsuariosRespuesta 但你直接得到数组 [{},{},{}...] 没有键然后需要Arraylist响应。

并序列化你的 POJO。

    public class Usuarios {
@field:SerializedName("name")
private String name;
@field:SerializedName("birthdate")
private String birthdate;
@field:SerializedName("id")
    private Integer id;
}

推荐阅读