首先还是类图先上
这个Json工具类和上一文中的XmlPull解析工具类似,通过一些设计模式把繁琐的重复的代码都封装起来,最后只需要简单的几句代码就可以实现数据解析。主要分三部分,分别是Json语句操作模块JsonParseTool.class,Json数据解析后的输出模块JsonDataHelper的实现类及其子类,最后是把这些复杂操作封装到一起,让我们调用几句代码就能实现Json解析操作的工具类JsonHandleTool.class,类似于中介。
这里先说一下输出模块,JsonDataHelperFather实现了接口JsonDataHelper,JsonDataHelperFather作为父类,通过模板模式定义一些参数和实现一些公共方法,接口的其他json数据输出方法其子类实现,如下面用于解析Book相关json数据的类:JsonDataHelperForBooks,在handleTags方法中,我们可以看到,它知道自己输出数据的时候的具体操作,遇到对应的标签就执行对应的set操作。最后得到一个装载了数据的book对象。
public class JsonDataHelperForBooks extends JsonDataHelperFather{
Books book;
ArrayList<Books> books ;
public JsonDataHelperForBooks() {
// TODO Auto-generated constructor stub
book = new Books();
books = new ArrayList<>();
}
@Override
public void addPerform() {
// TODO Auto-generated method stub
if(book != null) {
books.add(book);
book = null;
book = new Books();
}
}
@Override
public Object getPerform() {
// TODO Auto-generated method stub
if(books.size() > 1){
return books;
}else if(books.size() == 1){
return books.get(0);
}else {
return null;
}
}
@Override
public void handleTags(String tag, String value) {
// TODO Auto-generated method stub
if(tag.equals("name")){
book.setName(value);
}else if(tag.equals("author")){
book.setAuthor(value);
}else if(tag.equals("price")){
book.setPrice(value);
}
}
@Override
public void clear() {
// TODO Auto-generated method stub
books.clear();
}
}
当我们要新增一个输出Person相关json数据的类JsonDataHelperForPersons时,只需要按照JsonDataHelperForBooks的类实现里面的逻辑即可,JsonParseTool这个类不需要改动任何东西,就能解析Person相关的json数据,然后通过类JsonDataHelperForPersons输出。
接着说一下JsonHandleTool这个类,如果不把解析操作封装在这个类中,那么我们还是要通过写很多代码才能实现json解析,并且这个过程是有执行顺序的,这样的情况下我们可以用外观模式将所有有序的繁杂的操作封装起来,让JsonHandleTool这个类帮我们完成,我们每次只需要通过简单的几句代码调用JsonHandleTool,就能实现json解析和输出操作。
最后附上项目的git地址:https://github.com/WhyAllAIX/PullParserTool/blob/master/JsonParseTool.rar