Android 使用改型库获取简单JSON对象响应

Android 使用改型库获取简单JSON对象响应,android,json,retrofit,Android,Json,Retrofit,我有一个带有JSON响应的web查询,如下所示: { "status":true, "result": { "id":"1", "name":"ABC 1", "email":"info@ABc.dcom", "password":"123456", "status":false, "created":"0000-00-00 00:00:00" }, "

我有一个带有JSON响应的web查询,如下所示:

{
    "status":true,
    "result":
      {
        "id":"1",
        "name":"ABC 1",
        "email":"info@ABc.dcom",
        "password":"123456",
        "status":false,
        "created":"0000-00-00 00:00:00"
      },
    "message":"Login successfully"
}
我将以下代码用于:

@GET("/stockers/login")
public void login(
        @Query("email") String email,
        @Query("password") String password,
        Callback<JSONObject> callback);
@GET(“/stockers/login”)
公开作废登录(
@查询(“电子邮件”)字符串电子邮件,
@查询(“密码”)字符串密码,
回调(回调);
在调试器中,改型库发出的查询是正确的,但是我得到一个空JSON作为响应

ApiManager.getInstance().mUrlManager.login(
        email.getText().toString().trim(),
        password.getText().toString().trim(),
        new Callback<JSONObject>()
        {
            @Override
            public void success(JSONObject jsonObj, Response response)
            {
                mDialog.dismiss();
apimager.getInstance().mUrlManager.login(
email.getText().toString().trim(),
password.getText().toString().trim(),
新回调函数()
{
@凌驾
public void成功(JSONObject jsonObj,响应)
{
mDialog.discouse();

您可以使用使用Response类的翻新基本回调,而不是使用JSONObject类进行回调,然后,一旦获得响应,就必须从中创建JSONObject

if(response.isSuccessful())
    JSONObject json = new JSONObject(response.body().string());
见此:

否则,您可以创建自己的模型类来处理响应

ApiManager.getInstance().mUrlManager.login(
        email.getText().toString().trim(),
        password.getText().toString().trim(),
        new Callback<JSONObject>()
        {
            @Override
            public void success(JSONObject jsonObj, Response response)
            {
                mDialog.dismiss();
首先是结果类:

public class Result {
    public int id;
    public String name;
    public String email;
    public String password;
    public boolean status;
    public Date created;
}
然后您的响应类将用于改装

public class MyResponse {
    public boolean status;
    public Result result;
    public String message;
}
现在您可以拨打:

 @GET("/stockers/login") 
 public void login( 
    @Query("email") String email,
    @Query("password") String password,
    Callback<MyResponse> callback);
@GET(“/stockers/login”)
公众登入(
@查询(“电子邮件”)字符串电子邮件,
@查询(“密码”)字符串密码,
回调(回调);
试试这个:

@GET("/stockers/login")
public void login(
        @Query("email") String email,
        @Query("password") String password,
        Callback<Response> callback);  // set the callback generic parameter to Response


ApiManager.getInstance().mUrlManager.login(
        email.getText().toString().trim(),
        password.getText().toString().trim(),
        new Callback<Response>()
        {
            @Override
            public void success(Response response, Response response1)
            {
                String json = response.getBody();
                try {
                    JSONObject jsonObj = new JSONObject(json);
                } catch(JSONException e) {
                }

                alog.dismiss();
@GET(“/stockers/login”)
公开作废登录(
@查询(“电子邮件”)字符串电子邮件,
@查询(“密码”)字符串密码,
Callback);//将Callback泛型参数设置为Response
apimager.getInstance().mUrlManager.login(
email.getText().toString().trim(),
password.getText().toString().trim(),
新回调函数()
{
@凌驾
公共无效成功(响应,响应1)
{
字符串json=response.getBody();
试一试{
JSONObject jsonObj=新的JSONObject(json);
}捕获(JSONException e){
}
a.解雇;

我正在使用此站点从JSON创建我的类(POJO)

只需确保设置为JSON而不是JSON模式并检查GSON,因为改型也使用GSON进行解析


您的改装代码看起来不错。

您可以像belowe一样创建自定义工厂,也可以从这里复制:

公共类JSONConverterFactory扩展Converter.Factory{
公共静态JSONConverterFactory create(){
返回新的JSONConverterFactory();
}
私有JSONConverterFactory(){
}
@重写公共转换器ResponseByConverter(类型,注释[]注释,
改装(改装){
if(type==JSONObject.class){
返回JSONResponseBodyConverters.JSONObject ResponseBodyConverter.INSTANCE;
}
if(type==JSONArray.class){
返回JSONResponseBodyConverter.JSONArrayResponseBodyConverter.INSTANCE;
}
返回null;
}
}

公共类JSONRequestBodyConverter实现转换器{
静态最终JSONRequestBodyConverter实例=新的JSONRequestBodyConverter();
私有静态final MediaType MEDIA_TYPE=MediaType.parse(“text/plain;charset=UTF-8”);
私有JSONRequestBodyConverter(){
}
@重写公共RequestBody转换(T值)引发IOException{
返回RequestBody.create(MEDIA_TYPE,String.valueOf(value));
}
}

公共类JSONResponseBodyConverters{
私有JSONResponseBodyConverters(){}
静态最终类JSONObjectResponseBodyConverter实现转换器{
静态最终JSONObjectResponseBodyConverter实例=新的JSONObjectResponseBodyConverter();
@重写公共JSONObject转换(ResponseBy值)引发IOException{
试一试{
返回新的JSONObject(value.string());
}捕获(JSONException e){
e、 printStackTrace();
}
返回null;
}
}
静态最终类JSONArrayResponseBodyConverter实现转换器{
静态最终JSONArrayResponseBodyConverter实例=新的JSONArrayResponseBodyConverter();
@重写公共JSONArray转换(ResponseBy值)引发IOException{
试一试{
返回新的JSONArray(value.string());
}捕获(JSONException e){
e、 printStackTrace();
}
返回null;
}
}
}

在设置改装时使用JacksonConverterFactory而不是GsonConverterFactory。现在您可以直接使用JsonObject响应


编译'com.squareup.Reformation2:converter jackson:2.1.0'

只需使用
jsoneElement
而不是
JSONobject
。例如:

@GET("/stockers/login")
Call<JsonElement> getLogin(
    @Query("email") String email,
    @Query("password") String password
);
@GET(“/stockers/login”)
调用getLogin(
@查询(“电子邮件”)字符串电子邮件,
@查询(“密码”)字符串密码
);

对于改装1,答案有点旧,如果您使用的是改装2,而不想使用转换器,则必须使用
ResponseBody

@GET("/stockers/login")
public void login(
    @Query("email") String email,
    @Query("password") String password,
    Callback<ResponseBody> callback);

只需将要获取的对象类型定义为字符串,即com.google.gson.JsonObject,而不是String和call.toString()在该对象上获取JSON字符串本身。

无论是谁否决了这个答案,你都应该留下一条评论来解释原因。我认为这是一个非常好的答案。+1.这个答案在另一个方面帮助了我,但似乎并没有100%解决这个问题。
@GET("/stockers/login")
public void login(
    @Query("email") String email,
    @Query("password") String password,
    Callback<ResponseBody> callback);
if(response.isSuccessful())
    JSONObject json = new JSONObject(response.body().string());