Retrofit 2: Obtener JSON del cuerpo de respuesta

Quiero obtener string json de mi API usando la actualización 2, no tengo ningún problema cuando uso la modificación 1 para obtener esta json, pero el uso de la modificación 2 me devuelve nulo .

Así es como se ve mi json

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

Esta es mi API

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

Así es como se ve mi código

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

Soy nuevo en la retroadaptación 2 y uso el código anterior, siempre hace que mis aplicaciones se bloqueen porque response.body().toString() devuelve null.

Por favor, guíame sobre cómo obtener esa cadena json para poder convertirla en JsonObject.

Use este enlace para convertir su JSON en POJO con las opciones seleccionadas como se selecciona en la imagen a continuación

enter image description here

Obtendrás una clase POJO por tu respuesta como esta

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

y usa una interfaz como esta:

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

y llame así:

 Call call = api.checkLevel(1); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response 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 call, Throwable t) { } }); 

y usar dependencias en gradale

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

NOTA: El error ocurre porque cambió su JSON en POJO (mediante el uso de addConverterFactory(GsonConverterFactory.create()) en la addConverterFactory(GsonConverterFactory.create()) ). Si desea una respuesta en JSON, elimine addConverterFactory(GsonConverterFactory.create()) de Retrofit. Si no, utiliza la solución anterior

Si desea obtener una respuesta completa en formato JSON, intente esto:

He intentado una nueva forma de obtener una respuesta completa del servidor en formato JSON sin crear ninguna clase de modelo. No utilizo ninguna clase de modelo para obtener datos del servidor porque no sé qué respuesta obtendré o puede cambiar según los requisitos.

esta es la respuesta JSON:

 {"contacts": [ { "id": "c200", "name": "sunil", "email": "email@gmail.com", "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": "johnny_depp@gmail.com", "address": "xx-xx-xxxx,x - street, x - country", "gender" : "male", "phone": { "mobile": "+91 0000000000", "home": "00 000000", "office": "00 000000" } }, . . . ]} 
  1. En su interfaz API, cambie el parámetro

     public interface ApiInterface { @POST("/index.php/User/login")//your api link @FormUrlEncoded Call getmovies(@Field("user_email_address") String title, @Field("user_password") String body); } 
  2. en su actividad principal a la que llama esto

     ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); Call call = apiService.getmovies("a@gmail.com","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. después de eso, normalmente puede obtener el parámetro utilizando el objeto JSON y la matriz JSON

Salida enter image description here

usa esto para obtener String

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

en lugar de

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

y siempre mantenga un cheque para null antes de convertir responsebody en string

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

agregar dependencia para 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' 

crear clase para la URL base

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

después de eso crea un modelo de clase para obtener valor

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

crear clase de interfaz

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

después de eso en la clase principal

  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 call = apiService.getCompanyDetails(); call.enqueue(new Callback() { @Override public void onResponse(Callcall, Response response) { mProgressDialog.dismiss(); if(response!=null && response.isSuccessful()) { List 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(Callcall, Throwable t) { // Log error here since request failed Log.e(TAG, t.toString()); mProgressDialog.dismiss(); } }); }else{ //network error alert box } 

Un mejor enfoque es permitir que Retrofit genere POJO para usted desde el json (usando gson ). Lo primero es agregar .addConverterFactory(GsonConverterFactory.create()) al crear su instancia de Retrofit . Por ejemplo, si tenía una clase Java de User (como la que se muestra a continuación) que correspondía a su json, entonces su api de actualización podría devolver Call

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

Entonces, aquí está el trato:

Cuando están haciendo

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

Usted está pasando GsonConverterFactory.create () aquí. Si lo haces así, Gson convertirá automáticamente el objeto json que obtienes en respuesta a tu objeto . Aquí puede pasar a todos los otros convertidores como Jackson, etc …

utilizar esta

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