Fruit - 让你像解析Json一样解析Html

Posted CoderGhui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fruit - 让你像解析Json一样解析Html相关的知识,希望对你有一定的参考价值。

作为一个APP开发者,你是否经常苦于没有接口来现自己的想法?反正我之前会,但现在不会了,因为有了Fruit。

开发背景

事情是这样的,作为一个经常刷V2EX的程序员,我发现V站并没有提供官方的客户端,而一些热心网友开发的第三方客户端虽然有几个,但功能丰富、设计良好又经常维护更新的几乎没有。于是就萌生了自己做一个的想法。
说做就做,首先就是接口问题,调查一番之后发现虽然V站提供了一些接口,但要想做一个功能完备的APP,那几个接口是完全不够的(接口实在是太简单了)。接口不够那就只能去解析html了。
Java下的html解析Jsoup是最出名的了。Jsoup虽然完全能实现功能,但每个html解析的过程都要专门针对性的去做(甚至可能会把html的解析过程与具体的业务逻辑混杂在一起)。没有Json接口下用Gson以注解的方式来解析来的简单优雅。

那能不能像Gson解析Json那样以注解的方式来描述解析的逻辑,让解析的逻辑完全封装于具体的实体中。完全像使用普通的Json那样去使用html。经过一番对Gson源码的研究,最终完成了Fruit。

Fruit

简单的说Fruit之于html正如Gson之于Json,它能让你以一种注解的方式来描述解析的逻辑。下面是一个例子:

public class FruitInfo {    @Pick("div#only")    private String favorite;    @Pick(value = "div#only", attr = Attrs.OWN_TEXT)    private String favoriteOne;    @Pick(value = "div#only", attr = Attrs.HTML)    private String favoriteHtml;    @Pick(value = "img.apple", attr = Attrs.SRC)    private String img;    @Pick(value = "a.author", attr = Attrs.HREF)    private String blog;    @Pick("div.fruit")    private List<Item> items;    public static class Item {        @Pick("strong.name")        private String name;        @Pick(".color")        private String color;        @Pick(attr = "id")        private int id;
    }
}

这里就不做更多的说明了,GitHub项目主页有更丰富的使用说明,欢迎访问查看。

V2er

V2er就是开始时说的那个要开发的V2EX客户端。
这个APP的开发是从去年底开始一直到今年9月中旬基本开发完成,到现在也迭代了几个版本,在市场上也获得了很多用户的好评与鼓励平均评分在4.8,
欢迎各位朋友去下载使用,在Google Play及酷安市场已上架。

前几天也写了个基本版 - V2er-Core把V2er的核心代码开源了。这个小项目完整的展示了如何利用 “Fruit/Retrofit2/OKHttp3/RxJava” 来开发这种APP(数据大部分来源于html及少量json接口)
下面一段代码是最终实现后的Retrofit API Service代码样例(是不是看上去和使用真的Json接口一样)

public interface APIs {    @GET("/api/topics/hot.json") @Json
    Observable<DailyHotInfo> dailyHot();    @GET("/") @Html
    Observable<NewsInfo> homeNews(@Query("tab") String tab);
}

大家可以去这里找到它的源码。

以上是关于Fruit - 让你像解析Json一样解析Html的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:让你像写SQL一样做数据分析

hive--构建于hadoop之上让你像写SQL一样编写MapReduce程序

模块化游戏控制器让你像拼乐高一样玩游戏

Hive解析Json数据

5分钟让你学会用最高效的工具解析所有Json

Hive -解析json(get_json_object)