【问题标题】:Getting simple JSON object response using Retrofit library使用 Retrofit 库获取简单的 JSON 对象响应
【发布时间】:2015-06-29 09:25:21
【问题描述】:

我有一个带有 JSON 响应的网络查询:

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

在调试器中,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();

【问题讨论】:

    标签: android json retrofit


    【解决方案1】:

    只需使用JsonElement 插入JSONobject。喜欢:

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

    【讨论】:

      【解决方案2】:

      您可以使用使用 Response 类的 Retrofit 基本回调,而不是使用 JSONObject 类的回调,然后,一旦获得响应,您必须从中创建 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);
      

      【讨论】:

        【解决方案3】:

        对于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());
        

        【讨论】:

          【解决方案4】:

          您可以像下面这样创建自定义工厂或从此处复制它: 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;
                  }
              }
          }
          

          【讨论】:

          • 无论谁否决了这个答案,你都应该发表评论解释原因。我认为这是一个非常好的答案。 +1。
          【解决方案5】:

          试试这个:

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

          【讨论】:

            【解决方案6】:

            只需将要获取的对象的类型定义为 com.google.gson.JsonObject 而不是 String 并在其上调用 .toString()对象来获取 JSON 字符串本身。

            【讨论】:

            • 这个答案可以帮助我实现另一个目的,但似乎并不是真正 100% 解决了这个问题。
            【解决方案7】:

            我正在使用这个网站从 JSON 创建我的类 (POJO)。

            http://www.jsonschema2pojo.org/ 只需确保将 JSON Schema 设置为 JSON 并检查 GSON,因为改造也使用 GSON 进行解析。

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

            【讨论】:

              【解决方案8】:

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

              编译'com.squareup.retrofit2:converter-jackson:2.1.0'

              【讨论】:

                猜你喜欢
                • 2016-11-03
                • 1970-01-01
                • 2022-01-21
                • 2014-01-04
                • 2016-11-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-12-07
                相关资源
                最近更新 更多