Android从服务器获取到的数据解析为Date格式

282 阅读1分钟

在项目中,我使用了下面这个第三方库来进行网络请求,它是对RxJava+Retrofit的封装。

 compile 'com.github.lygttpod:RxHttpUtils:2.3.3'

项目中有对Data的解析,但是这个库自带的GsonAdapter不支持对Data的解析,所以我百度后找到了解决方法,增加解析方式。 在这个库中,可以通过以下方式来设置GsonAdapter。

 RxHttpUtils
                .getInstance()
                .init(this)
                .config()
                //使用自定义factory的用法
                //.setCallAdapterFactory(RxJava2CallAdapterFactory.create())
                //.setConverterFactory(ScalarsConverterFactory.create(),GsonConverterFactory.create(GsonAdapter.buildGson()))
                //配置全局baseUrl
                .setBaseUrl("https://api.douban.com/")
                //开启全局配置
                .setOkClient(okHttpClient);

这个GsonAdapter是库自带的:

public class GsonAdapter {

    public static Gson buildGson() {
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Integer.class, new IntegerDefault0Adapter())
                .registerTypeAdapter(int.class, new IntegerDefault0Adapter())
                .registerTypeAdapter(Double.class, new DoubleDefault0Adapter())
                .registerTypeAdapter(double.class, new DoubleDefault0Adapter())
                .registerTypeAdapter(Long.class, new LongDefault0Adapter())
                .registerTypeAdapter(long.class, new LongDefault0Adapter())
                .create();

        return gson;
    }

}

改变后:

public class GsonAdapter {

    public static Gson buildGson() {
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Integer.class, new IntegerDefault0Adapter())
                .registerTypeAdapter(int.class, new IntegerDefault0Adapter())
                .registerTypeAdapter(Double.class, new DoubleDefault0Adapter())
                .registerTypeAdapter(double.class, new DoubleDefault0Adapter())
                .registerTypeAdapter(Long.class, new LongDefault0Adapter())
                .registerTypeAdapter(long.class, new LongDefault0Adapter())
                .registerTypeAdapter(Date.class,new DateDeserializer())
                .create();

        return gson;
    }

}

基于第三方的新增了一句.registerTypeAdapter(Date.class,new DateDeserializer())
再创建一个文件:

public  class DateDeserializer implements JsonDeserializer<Date> {

    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        if (json != null) {
            final String jsonString = json.getAsString();
            try {
                return dateFormat.parse(jsonString);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            final long jsonLong= json.getAsLong();
            try {
                return new Date(jsonLong);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

这样就可以完美解析带Data类型的数据了。

感谢帮助:Retrofit里面Gson解析日期出错