【问题标题】:Android Parsing Same variable object name in retrofitAndroid在改造中解析相同的变量对象名称
【发布时间】:2017-03-08 07:10:16
【问题描述】:

我看过很多关于改造的例子。我已经完成了大多数类似 listview 的工作,但这是我不容易找到的新东西。我正在使用 retrofit2。这里它具有相同的名称详细信息第一个是简单对象,其他有嵌套对象,我有点困惑如何解析它。它是登录表单首先它检查详细信息是否是一个,然后它会更进一步。

[
 {
"title": "success",
"details": "1"
},
{
"title": "data",
"details": {
  "EMPLOYEE_ID": 5,
  "FIRST_NAME": "ABHISHEK",
  "LAST_NAME": "BARDOLIA"

  }
 }
]

这是登录时使用的接口。

  public interface LoginInterface {
  @GET("Login")
  Call<List<ClsLogin>> Login(@Query("username") String username
        , @Query("password") String password
        , @Query("imei") String imei);
}

模型类: 公共类 ClsLogin {

@SerializedName("title")
String title;

@SerializedName("details")
String details;

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDetails() {
    return details;
}

public void setDetails(String details) {
    this.details = details;
 }
}

响应代码:

public static void login(final LoginCallback logincallback, ClsLogin ObjLogin) {
    LoginInterface apiLoginService = ApiClient.getClient().create(LoginInterface.class);

    Call<List<ClsLogin>> call = apiLoginService.Login(
            ObjLogin.getUsername(),
            ObjLogin.getPassword(),
            ObjLogin.getImei());
    Log.e("response", String.valueOf(call.request().url()));


call.enqueue(new Callback<List<ClsLogin>>() {
    @Override
    public void onResponse(Call<List<ClsLogin>> call, Response<List<ClsLogin>> response) {
        Log.e("response", "onResponse ");
    }

    @Override
    public void onFailure(Call<List<ClsLogin>> call, Throwable t) {
        Log.e("response", t.getLocalizedMessage());
    }
});


}

【问题讨论】:

  • 使用jsonschema2pojo.org 为您的响应生成模型类
  • 如何使用这个@Divyesh?
  • 首先复制你的json并粘贴到上面的站点,然后从右侧菜单中选择JSON和GSON并点击预览
  • @Divyesh 谢谢兄弟,为响应创建一个模型类非常简单,但现在我们如何检查第一个细节然后运行第二个细节?
  • 我认为你需要更改上面的参数名称,如消息和 msgcode

标签: android json retrofit retrofit2 gson


【解决方案1】:

你可以看到GsonConverterFactory如何解析数据:

  @Override
  public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
  Retrofit retrofit) {
     TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
     return new GsonResponseBodyConverter<>(adapter);
}

GsonResponseBodyConverter 的工作原理:

    @Override public T convert(ResponseBody value) throws IOException {
    try {
      return adapter.fromJson(value.charStream());
    } finally {
      value.close();
    }
  }

因此您可以编写自己的 ResponseBodyConverter 来区分数据和状态代码,您只需重写 convert 方法。 因为,GsonConverterFactory 和 GsonRequestBodyConverter 是最终类,您应该将它们复制到您的项目中。您应该编写自定义 GsonResponseBodyConverter:

 final class CusGsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
    private final TypeAdapter<T> adapter;
    private final Gson gson;

    CusGsonResponseBodyConverter(TypeAdapter<T> adapter) {
        this.adapter = adapter;
        this.gson = new Gson();
    }

    @Override
    public T convert(ResponseBody value) throws IOException {
        //get the response string data
        String response = value.string();

        //in there,you can check your data
        // for exp,you can catch the exception and return the entity with error flag
        //or just return the gson entity,like this:
        MediaType contentType = value.contentType();
        Charset charset = contentType != null ? contentType.charset(UTF_8) : UTF_8;
        InputStream inputStream = new ByteArrayInputStream(response.getBytes());
        Reader reader = new InputStreamReader(inputStream, charset);
        JsonReader jsonReader = gson.newJsonReader(reader);

        try {
            return adapter.read(jsonReader);
        } finally {
            value.close();
        }
    }
}

【讨论】:

  • 你能详细说明一下给定问题的小演示示例吗?
猜你喜欢
  • 1970-01-01
  • 2016-09-29
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
相关资源
最近更新 更多