Map如何转换成对象_如何把Map转换成对象
2014-07-28 13:32:15  By: dwtedx

介绍

在做一个项目的时候,遇到了一点小问题,就是map转换成对象,相信大家都遇到过了,我写下来只是为了自己记下哦

从solr结果集中取数据,取到了结果集,但是结果集是一个map,而我想要得到的是一个对象,怎么处理呢?

我先后尝试了三种方式:
以下是获取的源数据:


SolrDocument[{id=25157561, productId=000000000108292291, 
product={"name":"鸭鸭 轻薄羽绒服女正品清仓 时尚春秋外套 柠檬黄 170/92A",
"oldId":"19999729","type":"0","brandId":"000153467","brandName":"鸭鸭",
"labelPaste":"null","imageCount":5,"firstCategoryId":"361003",
"secondCategoryId":"161007","thirdCategoryId":"346882",
"firstCategoryName":"服装鞋帽","secondCategoryName":"女装",
"thirdCategoryName":"羽绒服","purchaseCategory":"R9001206",
"id":"000000000108292291","groupId":"284049","color":"柠檬黄",
"version":"170/92A"}, showOrderFlag=0, userId=6000654740, 
user={"province":"","birthday":"","constellation":"",
"id":"6000654740","nickName":"112***1","gender":"","typeId":"1",
"imageUrl":"http://image.dwtedx.com//01_60x60.jpg",
"levelId":"161000000020","levelName":"银卡会员"}, 
storeFlag=0, store={}, againReviewFlag=0, 
title=, content=骨灰盒江景房, contentLength=6, labels=[], 
score=1, anonymousFlag=0, bestFlag=0, sort=0, status=0, 
createDate=Tue Aug 27 17:02:43 CST 2013, publishIp=10.19.95.189, 
publishDeviceId=1, usefulVoteCount=0, replyCount=0}]
方案一:solrDocument中提供了一个获取每个field对应值的方法,使用此方法获取所有的field对应的值,set到类中:



private List<ReviewFieldDTO> setReviewData(SolrDocumentList list) {
	List<ReviewFieldDTO> datas = new ArrayList<ReviewFieldDTO>();
	String jsonStr = "";
	ReviewFieldDTO review = null;
	for (SolrDocument solrDocument : list) {
		review = new ReviewFieldDTO();
		review.setId((Long)solrDocument.getFieldValue("id"));
		review.setProduct(solrDocument.getFieldValue("product").toString());
		review.setOrderDate((Date)solrDocument.getFieldValue("orderDate"));
		...
		 
		datas.add(review);
	}
	return datas;
}


这样做的缺点:


1、我的类中有20-30个属性,就要需要二三十此,代码相当低级,可读性很差


2、如果solr中没有一个field对应的值为空,就会报异常,这样每一个solrDocument.getFieldValue方法都要try-catch,

我想这样写肯定不行,能不能直接将solrDocument变成我要的ReviewFieldDTO类呢,经过代码编写,我使用了第二种方案:


方案二:我使用了BeanUtils工具+反射,通过反射,获取solrDocument中的所有key和value,

然后利用BeanUtils.setProperty(bean, name, value);方法,给ReviewFieldDTO设置属性,这样也有缺点,

就是反射过程中容易出现异常,另外更严重的是此方法对Date类型的属性不能处理,而ReviewFieldDTO中有Date类型的属性,

如果非要使用这种方案,就要写date类型的转换类,无疑增加了代码量,我只能放弃这种方案。


方案三:这是最后想到的一种方案,因为拿到上面的map值后,感觉跟json很像,但是又不是json格式,

一直在做的是将map直接转换为对像,忘记了可以使用json作为中间变量,所以方案三你们应该是想到了:


private List<ReviewFieldDTO> setReviewData(SolrDocumentList list) {
	List<ReviewFieldDTO> datas = new ArrayList<ReviewFieldDTO>();
	String jsonStr = "";
	ReviewFieldDTO review = null;
	for (SolrDocument solrDocument : list) {
		jsonStr = getJson(solrDocument);
		review = new ReviewFieldDTO();
		review = gson.fromJson(jsonStr, ReviewFieldDTO.class);
		datas.add(review);
	}
	return datas;
}
就是先将solrDocument类转换为json,然后再将此json转换为我要的ReviewFieldDTO类,太爽了吧,


之前太逗比了吧 ,所以有时候设计思路很重要,不一定非要直接将map转成对象,可以使用中间变量。

OK,先这么多吧
下面一楼一位大哥给的评论太爽了,之前工作都是废的啊,原来solr中提供了将solrDcoument转换为类的API,哎,道行差太远啊。。。


private List<ReviewFieldDTO> setReviewData(SolrDocumentList list) {
	DocumentObjectBinder binder = new DocumentObjectBinder();
	List<ReviewFieldDTO> reviews = binder.getBeans(ReviewFieldDTO.class, list);
	return reviews;
}


若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


快速评论


技术评论

  • 该技术还没有评论、赶快抢沙发吧...
DD记账
top
+