map中的Groovy对象属性
不必从对象声明贴图中的所有属性,例如:map中的Groovy对象属性,groovy,Groovy,不必从对象声明贴图中的所有属性,例如: prop1: object.prop1 你就不能像下面那样把东西扔进去吗?或者什么是实现这一目标的正确方法 results: [ object, values: [ test: 'subject' ] ] 这似乎很有效 *:object.properties object.properties也将为您提供一个类 您应该能够做到: 考虑到您的POGO对象: class User { String nam
prop1: object.prop1
你就不能像下面那样把东西扔进去吗?或者什么是实现这一目标的正确方法
results: [
object,
values: [
test: 'subject'
]
]
这似乎很有效
*:object.properties
object.properties也将为您提供一个
类
您应该能够做到:
考虑到您的POGO对象:
class User {
String name
String email
}
def object = new User(name:'tim', email:'tim@tim.com')
编写一个方法来检查类并从中提取非合成属性:
def extractProperties(obj) {
obj.getClass()
.declaredFields
.findAll { !it.synthetic }
.collectEntries { field ->
[field.name, obj."$field.name"]
}
}
然后,将其映射到结果映射中:
def result = [
value: true,
*:extractProperties(object)
]
给你:
['value':true, 'name':'tim', 'email':'tim@tim.com']
如果您不介意使用一些库,这里有一个选项,您可以将对象转换为json,然后将其解析为映射。我将我的添加到baseObject中,在您的情况下,该对象将扩展
class BaseObject {
Map asMap() {
def jsonSlurper = new groovy.json.JsonSlurperClassic()
Map map = jsonSlurper.parseText(this.asJson())
return map
}
String asJson(){
def jsonOutput = new groovy.json.JsonOutput()
String json = jsonOutput.toJson(this)
return json
}
}
最初还没有编写json库。这与其他答案类似,但处理对象属性为列表的情况
class BaseObject {
Map asMap() {
Map map = objectToMap(this)
return map
}
def objectToMap(object){
Map map = [:]
for(item in object.class.declaredFields){
if(!item.synthetic){
if (object."$item.name".hasProperty('length')){
map."$item.name" = objectListToMap(object."$item.name")
}else if (object."$item.name".respondsTo('asMap')){
map << [ (item.name):object."$item.name"?.asMap() ]
} else{
map << [ (item.name):object."$item.name" ]
}
}
}
return map
}
def objectListToMap(objectList){
List list = []
for(item in objectList){
if (item.hasProperty('length')){
list << objectListToMap(item)
}else {
list << objectToMap(item)
}
}
return list
}
}
类基本对象{
映射asMap(){
Map Map=objectToMap(此)
返回图
}
def objectToMap(对象){
Map=[:]
for(object.class.declaredFields中的项){
如果(!item.synthetic){
if(对象“$item.name”.hasProperty('length')){
映射“$item.name”=ObjectListMap(对象“$item.name”)
}else if(object.“$item.name.”respondsTo('asMap')){
映射如果对象是一个映射,那么*:object
我应该提到它是一个POGO。但是我今天从你的回答中学到了一些新的东西。谢谢!*:object.properties似乎有效。谢谢object.properties
有时会带来额外的负担(不是你创建的属性),请参阅下面的不同解决方案:-)