package com.brucezee.jspider.parser; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.util.TypeUtils; import com.brucezee.jspider.parser.define.FieldDefine; import com.brucezee.jspider.parser.processor.FieldProcessor; import com.brucezee.jspider.parser.define.FieldTypeEnum; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 页面解析基类 * Created by zhoubing on 2016/12/1. */ public abstract class Parser { /** * 根据字段解析规则解析页面,输出结果对象 * @param data 待解析的页面 * @param fieldDefine 字段解析定义 * @param clazz 解析结果类 * @param <T> 对象泛型 * @return 解析结果对象 */ public <T> T parse(String data, FieldDefine fieldDefine, Class<T> clazz) { return parse(data, fieldDefine, clazz, new HashMap()); } /** * 根据字段解析规则解析页面,输出结果对象 * @param data 待解析的页面 * @param fieldDefine 字段解析定义 * @param clazz 解析结果类 * @param result 解析结果过程存储的Map * @param <T> 对象泛型 * @return 解析结果对象 */ public <T> T parse(String data, FieldDefine fieldDefine, Class<T> clazz, Map result) { parseData(data, fieldDefine, result); return JSON.parseObject(JSON.toJSONString(result), clazz); } /** * 根据多个字段解析规则解析多个页面,输出结果对象 * @param wraps 多个解析页面和解析定义的组合 * @param clazz 解析结果类 * @param <T> 对象泛型 * @return 解析结果对象 */ public <T> T parse(ParserWrap[] wraps, Class<T> clazz) { Map result = new HashMap(); for (int i = 0; i < wraps.length; i++) { parseData(wraps[i].getData(), wraps[i].getDefine(), result); } return JSON.parseObject(JSON.toJSONString(result), clazz); } /** * 根据多个字段解析规则解析多个页面,输出结果对象 * @param wraps 多个解析页面和解析定义的组合 * @param clazz 解析结果类 * @param <T> 对象泛型 * @return 解析结果对象 */ public <T> T parse(List<ParserWrap> wraps, Class<T> clazz) { Map result = new HashMap(); for (int i = 0; i < wraps.size(); i++) { parseData(wraps.get(i).getData(), wraps.get(i).getDefine(), result); } return JSON.parseObject(JSON.toJSONString(result), clazz); } /** * 根据字段解析规则解析页面,输出Map类型的对象 * @param data 待解析的页面 * @param fieldDefine 字段解析定义 * @return 解析结果Map类型的对象 */ public Map parse(String data, FieldDefine fieldDefine) { Map result = new HashMap(); parseData(data, fieldDefine, result); return result; } /** * 定义的字段类型转换成相应的Class * @param type 字段类型字符串 * @return 相应的Class */ protected Class<?> typeToClass(String type) { FieldTypeEnum typeEnum = FieldTypeEnum.parse(type); if (typeEnum != null) { return typeEnum.getClazz(); } return null; } /** * 根据字段定义将结果值转换成相应类型的值 * @param define 字段解析定义 * @param rootObject 根对象 * @param value 当前对象 * @return 相应类型的对象 */ protected Object castValue(FieldDefine define, Object rootObject, Object value) { //特殊处理 FieldProcessor fieldProcessor = define.getProcessor(); if (fieldProcessor != null) { value = fieldProcessor.process(rootObject, value != null ? value.toString() : null); } return TypeUtils.cast(value, typeToClass(define.getType()), null); } /** * 获取字符串列表第一项作为最终的值,并进行相应的类型转换 * @param list 列表 * @param rootObject 根对象 * @param define 字段解析定义 * @return 相应类型的对象 */ protected Object getValue(List<String> list, Object rootObject, FieldDefine define) { return castValue(define, rootObject, list != null && list.size() > 0 ? list.get(0) : null); } /** * 根据解析规则解析数据,并将相应解析结果存储于Map中 * @param data 待解析的页面 * @param fieldDefine 字段解析定义 * @param result 解析结果Map类型的对象 */ public abstract void parseData(String data, FieldDefine fieldDefine, Map result); }