Mapl的使用方式参考官方文档,灰常详细了。这里不再赘述。
如图所示,Mapl有以下方法,可供使用
Mapl类中并没有实现具体的操作方法,分别调用的具体的工具类:
- ObjConvertImpl,将maplist数据转换为指定的java对象
- ObjCompileImpl,将java对象转换为maplist结构。
- MaplRebuild,对maplist结构进行修改操作,可以修改,删除制定路径的值,可以合并多个maplist为一个。
- MaplMerge, 将多个maplist合并为一个。
- FilterConvertImpl,针对maplist进行过滤,可以根据路径去掉不想要的路径,或者仅保留制定路径的值。
- StructureConvert,可以根据模板将maplist结构进行转换,比如将{"name":"华为","date":"1992/01/02"}转换为:{"entName","华为","esDate":"1992/01/02"}
{% include JB/setup %}
ObjConvertImpl
ObjConvertImpl 是MaplCompile接口的默认实现,该接口只有一个方法parse,将用来将java对象转换为maplist,
parse方法中,将传入的参数(java对象)归类为三种类型进行处理:单个pojo对象,集合,数组,map,
这三个对象分别对应了 pojo2Json,coll2Json,array2Json,map2Json方法。
if (obj instanceof Collection || obj.getClass().isArray()) {
List<Object> list = new ArrayList<Object>();
memo.put(obj, list);
// 集合
if (obj instanceof Collection) {
return coll2Json((Collection) obj, list);
}
// 数组
return array2Json(obj, list);
} else {
Map<String, Object> map = new LinkedHashMap<String, Object>();
memo.put(obj, map);
// Map
if (obj instanceof Map) {
return map2Json((Map) obj, map);
}
// 普通 Java 对象
return pojo2Json(obj, map);
}
- pojo2Json方法将java对象存储成一个个键值对,最后返回Map对象。当然如果对象的属性也是一个pojo对象,继续调用parse方法继续处理即可。
- map2Json方法和pojo2Json类似,只不过是map本身就是一个个键值对。
- coll2Json和array2Json 方法将传入的java对象直接放入List中,如果属性是pojo对象继续调用parse处理即可。
不过有个疑惑,我原以为maplist中只是map和list组成的结构。其中存储基本数据类型,但貌似并不是,不太明白为什么这么设计,为什么不全部转为map或者list结构的数据
- map2Json方法中,并没有对值类型进行判断,然后进行递归处理。而是直接返回,这样返回的maplist结构中就有pojo对象了。
private Map<String, Object> map2Json(Map map, Map<String, Object> valMap) { if (null == map) return null; ArrayList<Pair> list = new ArrayList<Pair>(map.size()); Set<Entry<?, ?>> entrySet = map.entrySet(); for (Entry entry : entrySet) { String name = null == entry.getKey() ? "null" : entry.getKey().toString(); Object value = entry.getValue(); list.add(new Pair(name, value)); } return writeItem(list, valMap); }
- 而在pojo2Json中,只对属性依然是pojo的情况进行parse处理。而如果属性类型是集合的情况并没有处理,这里就不粘帖代码了,自行查看pojo2Json方法。
题外话
话说nutz的文档和注释,以及测试用例太完美了,这些配合起来读源码非常顺畅。