//递归更新一个json对象,原对象若没有则插入key,精妙!
@SuppressWarnings("unchecked")
Object setObjectRecursive(Object current,final Listpaths,int index, finalObject value) {//如果是已经超出path,我们就返回value即可,作为最底层叶子节点
boolean isLastIndex = index ==paths.size();if(isLastIndex) {returnvalue;
}
String path=paths.get(index).trim();boolean isNeedMap =isPathMap(path);if(isNeedMap) {
Mapmapping;//当前不是map,因此全部替换为map,并返回新建的map对象
boolean isCurrentMap = current instanceofMap;if (!isCurrentMap) {
mapping= new HashMap();
mapping.put(
path,
buildObject(paths.subList(index+ 1, paths.size()),
value));returnmapping;
}//当前是map,但是没有对应的key,也就是我们需要新建对象插入该map,并返回该map
mapping = ((Map) current);boolean hasSameKey =mapping.containsKey(path);if (!hasSameKey) {
mapping.put(path,buildObject(paths.subList(index+ 1, paths.size()),
value));returnmapping;
}//当前是map,而且还竟然存在这个值,好吧,继续递归遍历
current =mapping.get(path);
mapping.put(path, setObjectRecursive(current, paths, index+ 1, value));returnmapping;
}boolean isNeedList =isPathList(path);if(isNeedList) {
Listlists;int listIndexer =getIndex(path);//当前是list,直接新建并返回即可
boolean isCurrentList = current instanceofList;if (!isCurrentList) {
lists= expand(new ArrayList(), listIndexer + 1);
lists.set(
listIndexer,
buildObject(paths.subList(index+ 1, paths.size()),
value));returnlists;
}//当前是list,但是对应的indexer是没有具体的值,也就是我们新建对象然后插入到该list,并返回该List
lists = (List) current;
lists= expand(lists, listIndexer + 1);boolean hasSameIndex = lists.get(listIndexer) != null;if (!hasSameIndex) {
lists.set(
listIndexer,
buildObject(paths.subList(index+ 1, paths.size()),
value));returnlists;
}//当前是list,并且存在对应的index,没有办法继续递归寻找
current =lists.get(listIndexer);
lists.set(listIndexer,
setObjectRecursive(current, paths, index+ 1, value));returnlists;
}throw DataMException.asDataMException("该异常代表系统编程错误, 请联系DataX开发团队");
}//根据key的类型来选择获取value的方式
private boolean isPathMap(finalString path) {return StringUtils.isNotBlank(path) && !isPathList(path);
}private boolean isPathList(finalString path) {return path.contains("[") && path.contains("]");
}