改造2:从响应机构获取JSON

我想使用改装2从我的api获取字符串json,使用改装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,并使用下图中选择的选项

在此处输入图像描述

你会得到一个像你这样的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) { } }); 

并在gradale中使用依赖项

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

注意:发生错误是因为您将JSON更改为POJO(通过在改造中使用addConverterFactory(GsonConverterFactory.create()) )。 如果你想在JSON中响应,那么从Retrofit中删除addConverterFactory(GsonConverterFactory.create()) 。 如果没有,则使用上述解决方案

如果您想以JSON格式获得完整响应,请尝试以下操作:

我尝试了一种新方法,以JSON格式从服务器获取完整响应,而无需创建任何模型类。 我没有使用任何模型类从服务器获取数据,因为我不知道我将得到什么响应,或者它可能根据要求而改变。

这是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. 在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("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. 之后,您通常可以使用JSON对象和JSON数组获取参数

产量 在此处输入图像描述

用它来获取String

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

代替

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

并且在将responsebody转换为字符串之前始终检查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' 

为基本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; } } 

之后创建类模型来获取价值

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

创建接口类

 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从json(使用gson )为你生成POJO。 首先是在创建Retrofit实例时添加.addConverterFactory(GsonConverterFactory.create()) 。 例如,如果您有一个与您的json对应的User java类(如下所示),那么您的改装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();