LiteHttp 第四节:自定义DataParser和Json序列化库的替换

官网: http://litesuits.com

QQ群: 大群 47357508,二群 42960650

本系列文章面向android开发者,展示开源网络通信框架LiteHttp的主要用法,并讲解其关键功能的运作原理,同时传达了一些框架作者在日常开发中的一些最佳实践和经验。

本系列文章目录总览: http://blog.csdn.net/ko33600/article/details/49367409


1. DataParser机制简介

DataParser即数据解析器,其作用是将网络流对象转换为指定的对象,包括将缓存的存储和读取,甚至Json对象的转化等作用。

lite-http内置五种形式的请求,也就有五种DataParser类型:

  • StringRequest : 字符串请求,对应StringParser,将stream转为string。
  • BytesRequest : 字节请求,对应BytesParser,将stream转为byte。
  • JsonAbsRequest : Json对象请求,对应JsonParser,将stream转为Java Model。
  • BitmapRequest : 位图加载请求,对应BitmapParser,将stream转为bitmap。
  • FileRequest : 文件下载请求,对应FileParser,将stream转为file。

通过源码可以发现,他们的共同基类是DataParser,它有两个直接子类,将解析器分为两种:

  • MemCacheableParser :解析并处理可支持闪存缓存的数据,包括:StringRequest,BytesRequest和JsonAbsRequest。
  • FileCacheableParser :解析并处理仅支持文件缓存的数据,包括:BitmapRequest和FileRequest。

以上请求形式在实际应用中可能出现不能满足某些特定需求的情况,这时需要自定义DataParser来增强lite-http的数据处理能力。

2. 自定义DataParser实例

如果文件略大只能支持文件缓存,需要继承FileCacheableParser。
如果文件不大可以支持闪存缓存,则要继承MemCacheableParser。

举个例子,现在要将网络数据解析为JSONObject(android系统自带的org.json包里的JSONObject),我们首先可以确定返回JSONObject对象不会太大,可以支持闪存、文件两级缓存,代码如下:

/**
 * parse stream to JSONObject
 */
 class CustomJSONParser extends MemCacheableParser<JSONObject> {
    String json;

    /**
     * 实现远程网络流解析
     */
    @Override
    protected JSONObject parseNetStream(InputStream stream, long totalLength,
                                        String charSet) throws IOException {
        return streamToJson(stream, totalLength, charSet);
    }

    /**
     * 实现本地文件流解析
     */
    @Override
    protected JSONObject parseDiskCache(InputStream stream, long length) throws IOException {
        return streamToJson(stream, length, charSet);
    }

    /**
     * 实现文件缓存
     */
    @Override
    protected boolean tryKeepToCache(JSONObject data) throws IOException {
        return keepToCache(json);
    }

    /**
     * 1. 将 stream 转换为 String
     * 2. String 转为 JSONObject
     */
    protected JSONObject streamToJson(InputStream is, long length, String charSet) throws IOException {
        this.json = streamToString(is, length, charSet);
        try {
            return new JSONObject(json);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }
}

使用方式:


JsonRequest<JSONObject> jsonRequest = new JsonRequest<JSONObject> (userUrl, JSONObject.class);
jsonRequest.setDataParser(new CustomJSONParser());
liteHttp.executeAsync(jsonRequest.setHttpListener(new HttpListener<JSONObject>() {
    @Override
    public void onSuccess(JSONObject jsonObject, Response<JSONObject> response) {

    }
}));

3. Json序列化库的替换

Json序列化库比较出名的有fastjson,jackson,gson等,初学者往往不知道该选哪个,经过个人较大量的实践测试得出一些结论,仅供参考。

json的序列化及反序列化性能对比:

  • fastjson 处理处理少量数据的对象时速度最快;
  • jackson 在处理较大量数据的对象时速度最快;
  • gson 速度不及前两者。

其他方面:

  • fastjson需要getter方法,比较麻烦。
  • jackson jar包体积太大,不合适移动端开发。
  • gson 速度不是最快,但可以接受,包体积最小。

鉴于gson速度适中,API健全稳定,使用简单且包体积最小,lite-http默认使用gson作为json自动序列化及反序列化类库。

如果正在使用其他json自动化类库,当然也可以轻松替换

将gson替换为alibaba的fastjson类库:

// first, set new json framework instance. then, over.

Json.set(new FastJson());

FastJson类如何实现?

class FastJson extends Json {

    @Override
    public String toJson(Object src) {
        return JSON.toJSONString(src);
    }

    @Override
    public <T> T toObject(String json, Class<T> claxx) {
        return JSON.parseObject(json, claxx);
    }

    @Override
    public <T> T toObject(String s, Type type) {
        return JSON.parseObject(s, type);
    }

    @Override
    public <T> T toObject(byte[] bytes, Class<T> claxx) {
        return JSON.parseObject(bytes, claxx);
    }
}

像往常一样发送请求,json库就换为fastjson了:

// json model convert used #FastJson
liteHttp.executeAsync(new JsonAbsRequest<User>(userUrl) {}.setHttpListener(new HttpListener<User>() {
    @Override
    public void onSuccess(User user, Response<User> response) {
        response.printInfo();
    }
}));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot提供了自定义JSON序列化和反序列化的方式,可以通过实现`JsonSerializer`和`JsonDeserializer`接口来实现。 自定义JSON序列化: 1. 创建一个类,实现`JsonSerializer`接口,并重写`serialize`方法。在该方法中,可以自定义对象的序列化逻辑,将对象转换为JSON格式的字符串。 2. 在需要进行自定义序列化的字段上,使用`@JsonSerialize(using = YourSerializer.class)`注解,将自定义序列化类指定为该字段的序列化器。 自定义JSON序列化: 1. 创建一个类,实现`JsonDeserializer`接口,并重写`deserialize`方法。在该方法中,可以自定义JSON字符串的反序列化逻辑,将JSON字符串转换为对象。 2. 在需要进行自定义序列化的字段上,使用`@JsonDeserialize(using = YourDeserializer.class)`注解,将自定义的反序列化类指定为该字段的反序列化器。 示例代码如下: ```java // 自定义序列化器 public class CustomSerializer extends JsonSerializer<YourClass> { @Override public void serialize(YourClass value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // 自定义序列化逻辑 gen.writeString(value.toString()); } } // 自定义序列化器 public class CustomDeserializer extends JsonDeserializer<YourClass> { @Override public YourClass deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { // 自定义序列化逻辑 String value = p.getValueAsString(); return new YourClass(value); } } // 在需要进行自定义序列化和反序列化的字段上使用注解 public class YourClass { @JsonSerialize(using = CustomSerializer.class) private String field1; @JsonDeserialize(using = CustomDeserializer.class) private String field2; // 省略其他代码 } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值