2016-07-17 19 views
-1

私のアプリはRetrofitGsonを使用してAPIを使用しようとしています。期待通りBEGIN_ARRAYでしたが、GsonとRetrofitでBEGIN_OBJECTでした

私の要求が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; 
    } 
} 

私の応答の抽象化が01​​ですクラス:

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 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 

をあなたの活動に:

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メソッドを使用すると、データをロードしたいとき。

関連する問題