java 更新对象_java通过key-list和对应value更新当前对象
//遞歸更新一個(gè)json對(duì)象,原對(duì)象若沒(méi)有則插入key,精妙!
@SuppressWarnings("unchecked")
Object setObjectRecursive(Object current,final Listpaths,int index, finalObject value) {//如果是已經(jīng)超出path,我們就返回value即可,作為最底層葉子節(jié)點(diǎn)
boolean isLastIndex = index ==paths.size();if(isLastIndex) {returnvalue;
}
String path=paths.get(index).trim();boolean isNeedMap =isPathMap(path);if(isNeedMap) {
Mapmapping;//當(dāng)前不是map,因此全部替換為map,并返回新建的map對(duì)象
boolean isCurrentMap = current instanceofMap;if (!isCurrentMap) {
mapping= new HashMap();
mapping.put(
path,
buildObject(paths.subList(index+ 1, paths.size()),
value));returnmapping;
}//當(dāng)前是map,但是沒(méi)有對(duì)應(yīng)的key,也就是我們需要新建對(duì)象插入該map,并返回該map
mapping = ((Map) current);boolean hasSameKey =mapping.containsKey(path);if (!hasSameKey) {
mapping.put(path,buildObject(paths.subList(index+ 1, paths.size()),
value));returnmapping;
}//當(dāng)前是map,而且還竟然存在這個(gè)值,好吧,繼續(xù)遞歸遍歷
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);//當(dāng)前是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;
}//當(dāng)前是list,但是對(duì)應(yīng)的indexer是沒(méi)有具體的值,也就是我們新建對(duì)象然后插入到該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;
}//當(dāng)前是list,并且存在對(duì)應(yīng)的index,沒(méi)有辦法繼續(xù)遞歸尋找
current =lists.get(listIndexer);
lists.set(listIndexer,
setObjectRecursive(current, paths, index+ 1, value));returnlists;
}throw DataMException.asDataMException("該異常代表系統(tǒng)編程錯(cuò)誤, 請(qǐng)聯(lián)系DataX開(kāi)發(fā)團(tuán)隊(duì)");
}//根據(jù)key的類型來(lái)選擇獲取value的方式
private boolean isPathMap(finalString path) {return StringUtils.isNotBlank(path) && !isPathList(path);
}private boolean isPathList(finalString path) {return path.contains("[") && path.contains("]");
}
總結(jié)
以上是生活随笔為你收集整理的java 更新对象_java通过key-list和对应value更新当前对象的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql case函数吗_mySQL
- 下一篇: java 短链跳转原理_给你代码:短链接