java 更新对象_java通过key-list和对应value更新当前对象

//递归更新一个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("]");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值