it-swarm.com.ru

Получение простого ответа объекта JSON с помощью библиотеки Retrofit

У меня есть веб-запрос с ответом JSON как:

{
    "status":true,
    "result":
      {
        "id":"1",
        "name":"ABC 1",
        "email":"[email protected]",
        "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);

В отладчике запрос, сделанный библиотекой Retrofit, является правильным, однако в ответ я получаю пустой 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();
4
Muhammad Umar

Вместо Callback с классом JSONObject, вы можете использовать базовый обратный вызов Retrofit, который использует класс Response, а затем, как только вы получите ответ, вам нужно было создать JSONObject из него.

Смотрите это: https://stackoverflow.com/a/30870326/2037304

В противном случае вы можете создать свой собственный класс модели для обработки ответа.

Первый класс Result:

public class Result {
    public int id;
    public String name;
    public String email;
    public String password;
    public boolean status;
    public Date created;
}

И тогда ваш класс ответа для использования с Retrofit

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);
5
nicopasso

Просто используйте JsonElement вместо JSONobject. Подобно:

@GET("/stockers/login")
Call<JsonElement> getLogin(
    @Query("email") String email,
    @Query("password") String password
);
7
Shubham Vala

Ответы вроде бы старые и для Retrofit 1, если вы используете Retrofit 2 и не хотите использовать конвертер, вы должны использовать ResponseBody.

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

А затем в вашем обратном вызове в методе onResponse вызовите string для тела и создайте из него JSONObject.

if(response.isSuccessful())
    JSONObject json = new JSONObject(response.body().string());
2
EarlOfEgo

Вы можете создать собственную фабрику, как показано ниже, или скопировать ее отсюда: https://github.com/marcinOz/Retrofit2JSONConverterFactory

public class JSONConverterFactory extends Converter.Factory {
    public static JSONConverterFactory create() {
        return new JSONConverterFactory();
    }

    private JSONConverterFactory() {
    }

    @Override public Converter<?, RequestBody> requestBodyConverter(Type type,
                                                                    Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
        if (type == JSONObject.class
                || type == JSONArray.class) {
            return JSONRequestBodyConverter.INSTANCE;
        }
        return null;
    }

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
                                                            Retrofit retrofit) {
        if (type == JSONObject.class) {
            return JSONResponseBodyConverters.JSONObjectResponseBodyConverter.INSTANCE;
        }
        if (type == JSONArray.class) {
            return JSONResponseBodyConverters.JSONArrayResponseBodyConverter.INSTANCE;
        }
        return null;
    }
}

public class JSONRequestBodyConverter<T> implements Converter<T, RequestBody> {
    static final JSONRequestBodyConverter<Object> INSTANCE = new JSONRequestBodyConverter<>();
    private static final MediaType MEDIA_TYPE = MediaType.parse("text/plain; charset=UTF-8");

    private JSONRequestBodyConverter() {
    }

    @Override public RequestBody convert(T value) throws IOException {
        return RequestBody.create(MEDIA_TYPE, String.valueOf(value));
    }
}

public class JSONResponseBodyConverters {
    private JSONResponseBodyConverters() {}

    static final class JSONObjectResponseBodyConverter implements Converter<ResponseBody, JSONObject> {
        static final JSONObjectResponseBodyConverter INSTANCE = new JSONObjectResponseBodyConverter();

        @Override public JSONObject convert(ResponseBody value) throws IOException {
            try {
                return new JSONObject(value.string());
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    static final class JSONArrayResponseBodyConverter implements Converter<ResponseBody, JSONArray> {
        static final JSONArrayResponseBodyConverter INSTANCE = new JSONArrayResponseBodyConverter();

        @Override public JSONArray convert(ResponseBody value) throws IOException {
            try {
                return new JSONArray(value.string());
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
}
2
oziem

попробуйте это вместо: 

@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();
2
Fouad Wahabi

Я использую этот сайт для создания своих классов (POJO) из JSON.

http://www.jsonschema2pojo.org/ просто убедитесь, что установлено JSON вместо JSON Schema, и проверьте GSON, потому что при модификации также используется GSON для синтаксического анализа. 

ваш модифицированный код выглядит нормально.

0
Karoly

При установке Retrofit используйте JacksonConverterFactory вместо GsonConverterFactory. Теперь вы можете напрямую работать с ответами JsonObject.

скомпилируйте 'com.squareup.retrofit2: преобразователь-Джексон: 2.1.0'

0
Sahil Patel