2016-12-05 38 views
13

chcę uzyskać ciąg json z mojego API używając modernizację 2, nie mam problemu podczas korzystania doposażenia 1 otrzymaj json, ale stosując modernizacyjny 2 powroty zerowe dla mnie.Modernizacja 2: Get JSON z ciała Response

To właśnie moja json wygląda

{"id":1,"Username":"admin","Level":"Administrator"} 

To mój API

@FormUrlEncoded 
@POST("/api/level") 
Call<ResponseBody> checkLevel(@Field("id") int id); 

ten sposób mój kod wygląda

Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Config.BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     Api api = retrofit.create(Api.class); 
     Call<ResponseBody> call = api.checkLevel(1); 
     call.enqueue(new Callback<ResponseBody>() { 
      @Override 
      public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
       JsonObject post = new JsonObject().get(response.body().toString()).getAsJsonObject(); 
        if (post.get("Level").getAsString().contains("Administrator")) { 

        } 
      } 

      @Override 
      public void onFailure(Call<ResponseBody> call, Throwable t) { 
      } 
     }); 

Jestem nowy modernizacja 2 i używanie powyższego kodu powoduje zawsze awarię moich aplikacji, ponieważ response.body().toString() zwraca wartość null.

Proszę, poprowadź mnie, jak uzyskać ciąg JSON, aby przekonwertować go na JsonObject.

+0

spojrzeć http://stackoverflow.com/questions/21398598/how-to-post- raw-whole-json-in-the-body-of-a-retrofit-request/36821182 # 36821182 – TommySM

Odpowiedz

16

użyć tej link do konwertowania JSON do POJO z wybranymi opcjami jak wybrany obrazek poniżej

enter image description here

Będziesz uzyskać klasę POJO za odpowiedź, jak ten

public class Result { 

    @SerializedName("id") 
    @Expose 
    private Integer id; 
    @SerializedName("Username") 
    @Expose 
    private String username; 
    @SerializedName("Level") 
    @Expose 
    private String level; 

    /** 
    * 
    * @return 
    * The id 
    */ 
    public Integer getId() { 
     return id; 
    } 

    /** 
    * 
    * @param id 
    * The id 
    */ 
    public void setId(Integer id) { 
     this.id = id; 
    } 

    /** 
    * 
    * @return 
    * The username 
    */ 
    public String getUsername() { 
     return username; 
    } 

    /** 
    * 
    * @param username 
    * The Username 
    */ 
    public void setUsername(String username) { 
     this.username = username; 
    } 

    /** 
    * 
    * @return 
    * The level 
    */ 
    public String getLevel() { 
     return level; 
    } 

    /** 
    * 
    * @param level 
    * The Level 
    */ 
    public void setLevel(String level) { 
     this.level = level; 
    } 

} 

i użytkowania interfejs tak:

@FormUrlEncoded 
@POST("/api/level") 
Call<Result> checkLevel(@Field("id") int id); 

i nazwać tak:

Call<Result> call = api.checkLevel(1); 
call.enqueue(new Callback<Result>() { 
    @Override 
    public void onResponse(Call<Result> call, Response<Result> response) { 
     response.body(); // have your all data 
     int id =response.body().getId(); 
     String userName = response.body().getUsername(); 
     String level = response.body().getLevel(); 
    } 

    @Override 
    public void onFailure(Call<Result> call, Throwable t) { 
    } 
}); 

i wykorzystanie zależności w Gradale

compile 'com.squareup.retrofit2:retrofit:2.3.0' 
compile 'com.squareup.retrofit2:converter-gson:2.+' 

UWAGA: Błąd występuje, ponieważ zmieniłeś JSON w POJO (przy użyciu modernizacji addConverterFactory(GsonConverterFactory.create())). Jeśli chcesz uzyskać odpowiedź w JSON, usuń addConverterFactory(GsonConverterFactory.create()) z Retrofitu.Jeśli nie, to użyć powyższego rozwiązania

+1

doskonała odpowiedź. To powinno zostać zaakceptowane. –

+0

Najbliższe rozwiązanie, którego szukałem, ale nowa wersja podsuwa nam publiczne void onResponse (odpowiedź retrofit.Response , Retrofit modernizacja), ale moje modele są podobne do http://hastebin.com/cobezeyoyi.java i response.body(). nie daje mi metod pobierania ... – Sam

+0

dla pytania OP POJO jest poprawne. Jeśli masz inne pytanie, to musisz stworzyć metody getter i setter, których nie ma w twoim POJO. – sushildlh

0

Lepszym rozwiązaniem jest umożliwienie Retrofit wygenerowania POJO dla ciebie z json (używając gson). Pierwszą rzeczą jest dodanie .addConverterFactory(GsonConverterFactory.create()) podczas tworzenia instancji Retrofit. Na przykład, jeśli miał klasę User Java (tak jak pokazano poniżej), które odpowiadały Twoim json, wówczas modernizacyjny api mógł wrócić Call<User>

class User { 
    private String id; 
    private String Username; 
    private String Level; 
    ... 
}  
+0

Przykro mi się nie zgodzić, ale Retrofit nie generuje POJO z json, ale tylko obiekt oparty na wcześniej zadeklarowanym POJO . – Julio

+0

Tak, to było to, co miałem na myśli ... "wygenerować instancję POJO", zgodzę się, że było to bardziej zrozumiałe, –

1

Więc tutaj jest wiele:

Dokonując

Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Config.BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

Przechodzisz tutaj GsonConverterFactory.create(). Jeśli zrobisz to w ten sposób, Gson automatycznie skonwertuje obiekt json, który otrzymasz w odpowiedzi na obiekt <ResponseBody>. Tutaj można przejść wszystkie inne konwertery, takich jak Jackson, etc ...

11

to wykorzystać, aby uzyskać String

String res = response.body().string(); 

zamiast

String res = response.body().toString(); 

i zawsze czek na wartości null przed konwersją responsebody ciąg

if(response.body() != null){ 
    //do your stuff 
} 
+9

to nie działa – kelvincer

+1

to nie działa ... ciało odpowiedzi jest wartością jednorazową, która może być zużywana tylko raz Kiedy więc w debugowaniu jest wywołanie "za sceną" od inspektora, a ciało jest zawsze pusty. – user3871754

-1

użyj tego

response.body().get(0).getUsername().toString(); 
1

dodać zależność dla retrofit2

compile 'com.google.code.gson:gson:2.6.2' 
compile 'com.squareup.retrofit2:retrofit:2.0.2' 
compile 'com.squareup.retrofit2:converter-gson:2.0.2' 

utworzyć klasę dla bazowej url

public class ApiClient  
{ 
public static final String BASE_URL = "base_url"; 

private static Retrofit retrofit = null; 

public static Retrofit getClient() { 
    if (retrofit==null) { 
     retrofit = new Retrofit.Builder() 
       .baseUrl(BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
    } 
    return retrofit; 
} 

} 

po tym modelu tworzenia klasy, aby uzyskać wartość

public class ApprovalModel { 

@SerializedName("key_parameter") 
private String approvalName; 
public String getApprovalName() { 
    return approvalName; 
} 
} 

tworzyć klasy interfejs

public interface ApiInterface { 
@GET("append_url") 
Call<CompanyDetailsResponse> getCompanyDetails(); 
} 

potem w głównej klasy

if(Connectivity.isConnected(mContext)){ 
      final ProgressDialog mProgressDialog = new ProgressDialog(mContext); 
      mProgressDialog.setIndeterminate(true); 
      mProgressDialog.setMessage("Loading..."); 
      mProgressDialog.show(); 

      ApiInterface apiService = 
        ApiClient.getClient().create(ApiInterface.class); 

      Call<CompanyDetailsResponse> call = apiService.getCompanyDetails(); 
      call.enqueue(new Callback<CompanyDetailsResponse>() { 
       @Override 
       public void onResponse(Call<CompanyDetailsResponse>call, Response<CompanyDetailsResponse> response) { 
        mProgressDialog.dismiss(); 
        if(response!=null && response.isSuccessful()) { 
         List<CompanyDetails> companyList = response.body().getCompanyDetailsList(); 

         if (companyList != null&&companyList.size()>0) { 
          for (int i = 0; i < companyList.size(); i++) { 
           Log.d(TAG, "" + companyList.get(i)); 
          } 
         //get values 
         }else{ 
          //show alert not get value 
         } 
        }else{ 
         //show error message 

        } 
       } 

       @Override 
       public void onFailure(Call<CompanyDetailsResponse>call, Throwable t) { 
        // Log error here since request failed 
        Log.e(TAG, t.toString()); 
        mProgressDialog.dismiss(); 
       } 
      }); 
     }else{ 
      //network error alert box 

     } 
+0

przejdź przez to i zaimplementuj w kodzie –

10

Jeśli chcesz dostać całą odpowiedź w formacie JSON, spróbuj tego:

Próbowałem nowy sposób, aby uzyskać całą odpowiedź z serwera w JSON format bez tworzenia żadnej klasy modelu. Nie używam żadnej klasy modelu do pobierania danych z serwera, ponieważ nie wiem, jaką odpowiedź otrzymam lub może się ona zmienić zgodnie z wymaganiami.

to odpowiedź JSON:

{"contacts": [ 
    { 
     "id": "c200", 
     "name": "sunil", 
     "email": "[email protected]", 
     "address": "xx-xx-xxxx,x - street, x - country", 
     "gender" : "male", 
     "phone": { 
      "mobile": "+91 0000000000", 
      "home": "00 000000", 
      "office": "00 000000" 
     } 
    }, 
    { 
     "id": "c201", 
     "name": "Johnny Depp", 
     "email": "[email protected]", 
     "address": "xx-xx-xxxx,x - street, x - country", 
     "gender" : "male", 
     "phone": { 
      "mobile": "+91 0000000000", 
      "home": "00 000000", 
      "office": "00 000000" 
     } 
    }, 
    . 
    . 
    . 
]} 
  1. w interfejsie API zmienić parametr

    public interface ApiInterface { 
    @POST("/index.php/User/login")//your api link 
    @FormUrlEncoded 
    Call<Object> getmovies(@Field("user_email_address") String title, 
           @Field("user_password") String body); 
    } 
    
  2. w swojej głównej działalności, w których dzwonisz ten

    ApiInterface apiService = 
         ApiClient.getClient().create(ApiInterface.class); 
    
    Call call = apiService.getmovies("[email protected]","123456"); 
    call.enqueue(new Callback() { 
        @Override 
        public void onResponse(Call call, Response response) { 
         Log.e("TAG", "response 33: "+new Gson().toJson(response.body())); 
        } 
    
        @Override 
        public void onFailure(Call call, Throwable t) { 
         Log.e("TAG", "onFailure: "+t.toString()); 
         // Log error here since request failed 
        } 
    }); 
    
  3. po tym można normalnie dostać się za pomocą parametru obiektu JSON i JSON tablicę

Wyjście enter image description here