Модернизация 2: Получить JSON из тела ответа

Я хочу получить строку json из моего api с помощью retrofit 2, у меня нет проблем при использовании retrofit 1, чтобы получить этот json, но использование retrofit 2 возвращает null для меня.

Вот как выглядит мой json

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

Это мой API

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

Так выглядит мой код

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

Я новичок в модификации 2 и используя вышеприведенный код, он всегда приводит к сбою моих приложений, потому что response.body().toString() возвращает null.

Сообщите мне, как получить эту строку json, чтобы я мог преобразовать ее в JsonObject.

Используйте эту ссылку для преобразования JSON в POJO с опциями выбора, выбранными на изображении ниже

введите описание изображения здесь

Вы получите class POJO для вашего ответа, как это

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

и используйте интерфейс следующим образом:

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

и вызывайте так:

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

и использовать зависимости в gradleусах

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

ПРИМЕЧАНИЕ . Ошибка возникает из-за того, что вы изменили свой JSON на POJO (с помощью addConverterFactory(GsonConverterFactory.create()) в модификации). Если вы хотите отклик в JSON, то удалите addConverterFactory(GsonConverterFactory.create()) из Retrofit. Если нет, то используйте вышеуказанное решение

Если вы хотите получить полный ответ в формате JSON, попробуйте следующее:

Я пробовал новый способ получить весь отклик от сервера в формате JSON без создания classа модели. Я не использую class модели для получения данных с сервера, потому что я не знаю, какой ответ я получу, или он может измениться в соответствии с требованиями.

это ответ 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. В интерфейсе API измените параметр

     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. в своем основном действии, где вы вызываете это

     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. после этого вы обычно можете получить параметр с использованием объекта JSON и массива JSON

Вывод введите описание изображения здесь

используйте это, чтобы получить String

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

вместо

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

и всегда проверяйте значение null перед преобразованием тела ответа в строку

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

добавить зависимость для 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' 

создать class для базового 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; } } 

после этого создайте модель classа, чтобы получить значение

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

создать class интерфейса

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

после этого в основном classе

  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 } 

Лучший подход – позволить Retrofit генерировать POJO для вас из json (используя gson ). Прежде всего, нужно добавить .addConverterFactory(GsonConverterFactory.create()) при создании экземпляра .addConverterFactory(GsonConverterFactory.create()) . Например, если у вас был Java-class User (например, показанный ниже), который соответствовал вашему json, тогда ваш api-приложение для восстановления может вернуть Call

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

Итак, вот сделка:

При создании

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

Вы передаете GsonConverterFactory.create () здесь. Если вы сделаете это так, Gson автоматически преобразует json-объект, который вы получите в ответ на ваш объект . Здесь вы можете передать все другие конверторы, такие как Jackson и т. Д. …

использовать это

 response.body().get(0).getUsername().toString(); 
Давайте будем гением компьютера.