Object 如果贴图列表有额外的键,如何将贴图列表转换为对象列表
我的问题几乎类似于 但是现在的问题是,我有Object 如果贴图列表有额外的键,如何将贴图列表转换为对象列表,object,arraylist,groovy,hashmap,Object,Arraylist,Groovy,Hashmap,我的问题几乎类似于 但是现在的问题是,我有映射的列表,其中映射包含一些额外的键,这些键在我的Pojo类中不作为属性出现,如下所示:- List list = [ [param1: "a", param2: ["a","b","c"], param3:[a:"a",b:"b",c:"c"], param4:true, param5:1, param6: "pamra6",param7: "pamra7"], [param1: "b", param2: ["d","e","f"],
映射的列表
,其中映射
包含一些额外的键,这些键在我的Pojo
类中不作为属性出现,如下所示:-
List list = [
[param1: "a", param2: ["a","b","c"], param3:[a:"a",b:"b",c:"c"], param4:true, param5:1, param6: "pamra6",param7: "pamra7"],
[param1: "b", param2: ["d","e","f"], param3:[d:"d",e:"e",f:"f"], param4:false, param5:2, param6: "pamra6",param7: "pamra7"]
]
list.collect { new Pojo(it) }
class Pojo {
def param1
def param2
def param3
def param4
def param5
def static build(def map) {
new Pojo(map.findAll { k, v -> k in Pojo.metaClass.properties*.name})
}
}
def newList = list.collect { Pojo.build(it) }
在这个列表中
两个额外的键param6
,param7
包含在Pojo
类中不存在的地方,因为在我的场景中,我只考虑那些出现在Pojo
中的属性,我不能增加Pojo
类中的额外属性
因此,当我要将此地图列表
转换为对象列表
时,如下所示:-
List list = [
[param1: "a", param2: ["a","b","c"], param3:[a:"a",b:"b",c:"c"], param4:true, param5:1, param6: "pamra6",param7: "pamra7"],
[param1: "b", param2: ["d","e","f"], param3:[d:"d",e:"e",f:"f"], param4:false, param5:2, param6: "pamra6",param7: "pamra7"]
]
list.collect { new Pojo(it) }
class Pojo {
def param1
def param2
def param3
def param4
def param5
def static build(def map) {
new Pojo(map.findAll { k, v -> k in Pojo.metaClass.properties*.name})
}
}
def newList = list.collect { Pojo.build(it) }
它抛出一个错误,如下所示:-
groovy.lang.MissingPropertyException:没有这样的属性:的param6
班级:Pojo
这是绝对正确的,但当我像下面这样转换时:-
list.collect { it as Pojo }
或
它不会抛出任何错误,但当我们得到如下值时:-
.each { pojo ->
pojo.param1
------------
------------
}
找不到这些值中的任何一个。找到的所有值均为null
当我使用.dump()
检查已转换的对象列表时,它被转换为Pojo1\u groovyProxy
类似于代理对象
所以我的问题是,在这种情况下如何转换??这里有一种方法可以做到这一点(如果以后将param6
添加到类中,它会尝试具有弹性):
(编辑:更干净,多亏了)
在提出建议后,通过以下方式实现:-
List list = [
[param1: "a", param2: ["a","b","c"], param3:[a:"a",b:"b",c:"c"], param4:true, param5:1, param6: "pamra6",param7: "pamra7"],
[param1: "b", param2: ["d","e","f"], param3:[d:"d",e:"e",f:"f"], param4:false, param5:2, param6: "pamra6",param7: "pamra7"]
]
list.collect { new Pojo(it) }
class Pojo {
def param1
def param2
def param3
def param4
def param5
def static build(def map) {
new Pojo(map.findAll { k, v -> k in Pojo.metaClass.properties*.name})
}
}
def newList = list.collect { Pojo.build(it) }
谢谢你给我一个大提示:)是否需要在Pojo
类中使用static build()
???没有预构建方法吗???除了matcher/declaredFields这件事,你就不能这样做:def fields=Pojo.declaredFields.findAll{!it.synthetic}*.name
@tim_yates在你建议我使用像def static build(def map){new Pojo(map.findAll)之前,你的观点给了我更多的澄清{k,v->k in Pojo.metaClass.properties*.name}
…这也正确吗?????