2016-07-17 290 views
-1

我的应用程序尝试使用RetrofitGson使用API​​。预计BEGIN_ARRAY,但是BEGIN_OBJECT与Gson和翻新

我的要求是https://nahuatiliztli.herokuapp.com/laws.json,它返回:

[{"id":1,"title":"Constitución Política de los Estados Unidos Mexicanos","url":"http://www.diputados.gob.mx/LeyesBiblio/pdf/1_29ene16.pdf","created_at":"2016-07-10T02:36:00.641Z","updated_at":"2016-07-10T02:36:00.641Z"}] 

我的代码的结构如下...

我的模型是Law类:

public class Law { 
    @SerializedName("id") 
    private Integer mId; 
    @SerializedName("title") 
    private String mTitle; 
    @SerializedName("url") 
    private String mUrl; 

    public Law(Integer id, String title, String url) { 
     mId = id; 
     mTitle = title; 
     mUrl = url; 
    } 

    public Integer getId() { 
     return mId; 
    } 

    public void setId(Integer id) { 
     mId = id; 
    } 

    public String getTitle() { 
     return mTitle; 
    } 

    public void setTitle(String title) { 
     mTitle = title; 
    } 

    public String getUrl() { 
     return mUrl; 
    } 

    public void setUrl(String url) { 
     mUrl = url; 
    } 
} 

我的回答抽象是LawsResponse等级:

public class LawsResponse { 
    private List<Law> mLaws; 

    public List<Law> getLaws() { 
     return mLaws; 
    } 

    public void setLaws(List<Law> laws) { 
     mLaws = laws; 
    } 
} 

我对Law模型服务接口:

public interface LawsService { 
    @GET("https://nahuatiliztli.herokuapp.com/laws.json") 
    Call<LawsResponse> listLaws(); 
} 

我的适配器是LawsApiAdapter

public class LawsApiAdapter { 

    private static LawsService API_SERVICE; 

    public static LawsService getInstance() { 
     if (API_SERVICE==null) { 
      Retrofit retrofit = new Retrofit.Builder() 
        .baseUrl(Constants.BASE_URL) 
        .addConverterFactory(GsonConverterFactory.create(buildLawsApiGsonConverter())) 
        .build(); 

      API_SERVICE = retrofit.create(LawsService.class); 
     } 

     return API_SERVICE; 
    } 

    private static Gson buildLawsApiGsonConverter() { 
     return new GsonBuilder() 
       .registerTypeAdapter(
         LawsApiAdapter.class, 
         new LawsDeserializer()) 
       .create(); 
    } 

} 

我已经尝试了许多建议,张贴在该网站,但它仍然抛出这个错误:

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

我通过阅读许多文章了解到它期望Json对象,它正在接收一个Json数组,但的确如此,但我不知道如何使其工作。

回答

3

LawsResponse不是必需的。当你想加载数据

public class YourActivity extends Activity implements Callback<List<Law>>{ 

//your rest of methods 

@Override 
    public void onResponse(Call<List<Law>> call, Response<List<Law>> response) { 
     List<Law> lawlist = response.body(); 
    } 

    @Override 
    public void onFailure(Call<List<Law>> call, Throwable t) { 

     Log.i("log", "exhibits api error : " + t.getLocalizedMessage()); 

    } 

    private void loadLawList(){ 
Call<List<Law>> call = LawsApiAdapter.getInstance().listLaws(); 
call.enqueue(this);//pass your callback instance 
    } 
} 

呼叫loadLawList方法:更新你的界面

public interface LawsService { 
    @GET("https://nahuatiliztli.herokuapp.com/laws.json") 
    Call<List<Law>> listLaws(); 
} 

而且你可以添加如下您的改装要求:

Call<List<Law>> call = LawsApiAdapter.getInstance().listLaws(); 
call.enqueue(this);//pass your callback instance 

在您的活动。

相关问题