从改造响应中获取 JSONArray

Posted

技术标签:

【中文标题】从改造响应中获取 JSONArray【英文标题】:Get JSONArray from Retrofit Response 【发布时间】:2018-06-11 21:17:44 【问题描述】:

//这是我从服务器获取的JSON


"code": "200",
"contentType": "Json",
"data": [
    "createdon": "2017-12-2",
    "fname": "abhay",
    "mobileno": "1234567890",
    "userid": 1234,
    "profileimagepath": null
],
"maxjsonlength": 1233,
"message": "Success",
"status": true

在从 Retrofit 响应中获取 code、contentType、maxjsonlength、message、status 的值时无法解析 JSONArray。请帮我解决问题。

//Model 
public class Example 

@SerializedName("code")
@Expose
private String code;
@SerializedName("contentType")
@Expose
private String contentType;
@SerializedName("data")
@Expose
private List<Datum> data = null;
@SerializedName("maxjsonlength")
@Expose
private Integer maxjsonlength;
@SerializedName("message")
@Expose
private String message;
@SerializedName("status")
@Expose
private Boolean status;

public String getCode() 
return code;


public void setCode(String code) 
this.code = code;


public String getContentType() 
return contentType;


public void setContentType(String contentType) 
this.contentType = contentType;


public List<Datum> getData() 
return data;


public void setData(List<Datum> data) 
this.data = data;


public Integer getMaxjsonlength() 
return maxjsonlength;


public void setMaxjsonlength(Integer maxjsonlength) 
this.maxjsonlength = maxjsonlength;


public String getMessage() 
return message;


public void setMessage(String message) 
this.message = message;


public Boolean getStatus() 
return status;


public void setStatus(Boolean status) 
this.status = status;




// Model of data JsonArray
public class Datum 

@SerializedName("createdon")
@Expose
private String createdon;
@SerializedName("fname")
@Expose
private String fname;
@SerializedName("mobileno")
@Expose
private String mobileno;
@SerializedName("userid")
@Expose
private Integer userid;
@SerializedName("profileimagepath")
@Expose
private Object profileimagepath;

public String getCreatedon() 
return createdon;


public void setCreatedon(String createdon) 
this.createdon = createdon;


public String getFname() 
return fname;


public void setFname(String fname) 
this.fname = fname;


public String getMobileno() 
return mobileno;


public void setMobileno(String mobileno) 
this.mobileno = mobileno;


public Integer getUserid() 
return userid;


public void setUserid(Integer userid) 
this.userid = userid;


public Object getProfileimagepath() 
return profileimagepath;


public void setProfileimagepath(Object profileimagepath) 
this.profileimagepath = profileimagepath;



//这是我向服务器发送请求的方式:

 @Headers(
    "Content-Type:application/json",
    "Bearer:mlm_token"
    )

@GET("api/v1.0/****/TestApi/id")
Call<Example> getTestJson(@Query("id") int userId);

//这是Retrofit Api代码

 DrawerMethods msgInterface = (DrawerMethods) NetworkModule
            .getInstance().createClassInstance(DrawerMethods.class);

       Call<Example> mLoginCall = msgInterface.getTestJson(userId);
        mLoginCall.enqueue(new Callback<Example>() 
        @Override
        public void onResponse(Call<Example> call, Response<Example> response) 
            if (response.isSuccessful()) 
                if (response.body() != null) 
                    //SomeCode
                    else
                        Toast.makeText(TodayMessage.this, "Invalid credentials!", Toast.LENGTH_SHORT).show();
                 else 
                    Toast.makeText(TodayMessage.this, "Failed to get Response", Toast.LENGTH_SHORT).show();
                
             else 
                Toast.makeText(TodayMessage.this, "Failed to get Response", Toast.LENGTH_SHORT).show();
            
        

        @Override
        public void onFailure(Call<Example> call, Throwable t) 

            Toast.makeText(TodayMessage.this, "Unable to connect to server", Toast.LENGTH_SHORT).show();
        
    );

【问题讨论】:

使用本网站:jsonschema2pojo.org @NabinBhandari 我用的一样。 请在您的帖子中添加改造 API 代码。 尝试评论 profileimagepath 获取代码然后尝试它,如果它有效,那么这意味着你没有得到它的对象。 @Ankita 只是为了测试你可以将 profileimagepath 类型更改为 String 并尝试一次吗? 【参考方案1】:

始终尝试使用this 创建 JSON POJO。 对于您的项目,请添加以下 2 个模型类

//获取模型

 public class Get 

    @SerializedName("code")
    @Expose
    private String code;
    @SerializedName("contentType")
    @Expose
    private String contentType;
    @SerializedName("data")
    @Expose
    private List<Datum> data = null;
    @SerializedName("maxjsonlength")
    @Expose
    private Integer maxjsonlength;
    @SerializedName("message")
    @Expose
    private String message;
    @SerializedName("status")
    @Expose
    private Boolean status;

    public String getCode() 
    return code;
    

    public void setCode(String code) 
    this.code = code;
    

    public String getContentType() 
    return contentType;
    

    public void setContentType(String contentType) 
    this.contentType = contentType;
    

    public List<Datum> getData() 
    return data;
    

    public void setData(List<Datum> data) 
    this.data = data;
    

    public Integer getMaxjsonlength() 
    return maxjsonlength;
    

    public void setMaxjsonlength(Integer maxjsonlength) 
    this.maxjsonlength = maxjsonlength;
    

    public String getMessage() 
    return message;
    

    public void setMessage(String message) 
    this.message = message;
    

    public Boolean getStatus() 
    return status;
    

    public void setStatus(Boolean status) 
    this.status = status;
    

 

//FOR模型基准

public class Datum 

@SerializedName("createdon")
@Expose
private String createdon;
@SerializedName("fname")
@Expose
private String fname;
@SerializedName("mobileno")
@Expose
private String mobileno;
@SerializedName("userid")
@Expose
private Integer userid;
@SerializedName("profileimagepath")
@Expose
private Object profileimagepath;

public String getCreatedon() 
return createdon;


public void setCreatedon(String createdon) 
this.createdon = createdon;


public String getFname() 
return fname;


public void setFname(String fname) 
this.fname = fname;


public String getMobileno() 
return mobileno;


public void setMobileno(String mobileno) 
this.mobileno = mobileno;


public Integer getUserid() 
return userid;


public void setUserid(Integer userid) 
this.userid = userid;


public Object getProfileimagepath() 
return profileimagepath;


public void setProfileimagepath(Object profileimagepath) 
this.profileimagepath = profileimagepath;



对于 API 调用使用这个,

//LoginPojo login check
 @Headers(
    "Content-Type:application/json",
    "Bearer:mlm_token"
    )

@GET("api/v1.0/****/TestApi/id")
Call<Get> savePost(@Query("id") int userId);

最后,如下调用web函数,

    public void logindataPost() 
    mAPIService.savePost().enqueue(new Callback<Get>() 
        @Override
        public void onResponse(Call<Get> call, Response<Get> response) 
            if (response.isSuccessful()) 
                Log.d("code", "" + response.body().getCode());
                Log.d("contentType", "" + response.body().getContentType());
                Log.d("createdon", "" + response.body().getData().get(0).getCreatedon());
                Log.d("fname", "" + response.body().getData().get(0).getFname());
                Log.d("mobileno", "" + response.body().getData().get(0).getMobileno());
                Log.d("userid", "" + response.body().getData().get(0).getUserid());
                Log.d("profileimagepath", "" + response.body().getData().get(0).getProfileimagepath());
                Log.d("maxjsonlength", "" + response.body().getMaxjsonlength());
                Log.d("message", "" + response.body().getMessage());
                Log.d("status", "" + response.body().getStatus());
             else 

            
        

        @Override
        public void onFailure(Call<Get> call, Throwable tr) 
            if (tr != null) 
                Log.d("TEST  Inside fail if", Log.getStackTraceString(tr));
            
        
    );


【讨论】:

【参考方案2】:
@Headers(
"Content-Type:application/json",
"Bearer:mlm_token"
)

@GET("api/v1.0/****/TestApi/id")
//Call<Get> savePost(@Query("id") int userId)
Call<Get> savePost(@Path("id") int userId);

将@Query 替换为@Path 解决了我的问题,没有改变代码中的任何其他内容。

【讨论】:

以上是关于从改造响应中获取 JSONArray的主要内容,如果未能解决你的问题,请参考以下文章

如何从包含android中API响应的缓存中获取改造缓存数据

改造回调获取响应体

如何从片段中的 JSON 响应中的对象获取数据

在改造中调用 api 时响应消息未找到和响应代码 404

如何通过改造解析 JSON 响应

Android - 使用改造和协程获取响应状态代码